2011-02-09 43 views
8

estoy recibiendo un error extraño 'truncado valor INTEGER incorrecto' cuando corro la siguiente consulta UPDATE:MySQL 'truncado valor INTEGER incorrectos'

update tbl 
set projectNumber = right(comments, 7) 
where createdBy = 'me' 
and length(CONVERT(right(comments, 7), SIGNED INTEGER)) = 7 
and CONVERT(right(comments, 7), SIGNED INTEGER) > 0 
and CONVERT(right(comments, 7), SIGNED INTEGER) is not null 
and createdOn > '2011-01-31 12:00:00' 
and projectNumber is null 

ProjectNumber es VARCHAR (10).

Cuando lo ejecuto como una selección directa, no obtengo un error y veo los resultados como se esperaba. ¿Algunas ideas? Básicamente estoy intentando actualizar el campo projectNumber donde el final de los comentarios en las notas importadas son 7 caracteres numéricos (pero projectNumber no son siempre 7 numéricos, por lo que el campo es varchar (10)).

Respuesta

8

No es un error. Es una advertencia que proviene de CONVERT() cuando le pide que convierta no numérico en entero;

ejecutar estas consultas en la consola para ver:

mysql> SELECT CONVERT(right('1s23d45678', 7), SIGNED INTEGER); 
+-------------------------------------------------+ 
| CONVERT(right('1s23d45678', 7), SIGNED INTEGER) | 
+-------------------------------------------------+ 
|            3 | 
+-------------------------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> SHOW WARNINGS; 
+---------+------+----------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+----------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: '3d45678' | 
+---------+------+----------------------------------------------+ 
1 row in set (0.00 sec) 

Como ya he dicho, es una advertencia, no un error. Su consulta debería estar haciendo la actualización correctamente.

+2

interesante. Sí dice el Código de Error 1292 (como su ejemplo), pero puedo confirmar que la actualización * no * se está ejecutando. Debo tener una configuración para abortar las advertencias en las actualizaciones? Seguiré cavando –

+3

Sospecho que su servidor se está ejecutando en el modo SQL 'TRADICIONAL', que convierte todas las advertencias en errores. http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_traditional – Mchl

+3

Derecha. De hecho, decidí usar solo una expresión regular (y derecha (comentarios, 7) REGEXP '^ [0-9] + $') y olvidarme de las tonterías de conversión. Funcionó bien. Muchas gracias por su ayuda. –

4

Otra causa común de esta advertencia es el espacio en blanco en la cadena que se va a convertir. Use trim() antes de convert() para deshacerse de eso.

0

Si está utilizando un tipo de texto para los datos de la columna y se trató de establecer el valor predeterminado como 0 a continuación, sólo establecerlo como NULL:

ALTER TABLE `__table__` 
CHANGE `__column_name__old__` `__column_name__new__` 
INT(4) NOT NULL DEFAULT '0';