2009-11-09 51 views
22

Estoy compilando una aplicación PHP/MySQL y estoy teniendo un problema con mi consulta de creación y actualización. Tengo 5 columnas configuradas para escribir FLOAT que también están configurados como columnas NULL. No planeo llenarlos hasta mucho más tarde en el flujo de trabajo.¿Qué es este error? "Error en la consulta de la base de datos: Datos truncados para la columna 'column_name' en la fila 1

Sin embargo, necesito crear nuevos registros para esta base de datos, y necesito editar los registros existentes, sin tocando estos 5 campos flotantes. Estoy usando OOP PHP que usa un método estándar save() que verifica si existe una identificación en el objeto. Si no, llama al create(), y si es así, llama al update(). bueno, generalmente.

Los métodos update() y create() están diseñados para extraer de una matriz de atributos protected static $db_fields declarada en la parte superior de cada Clase, que contiene todos los campos utilizados en esa tabla. update() y create() se ejecutan a través de esa matriz y INSERT INTO o UPDATE en SQL, en consecuencia.

Tengo entendido que si usa '' (dos comillas simples, vacías), SQL omitirá esas solicitudes INSERT INTO o UPDATE y las dejará como NULL. Ni siquiera hay campos de formulario para esos 5 valores flotantes en ninguna parte de la página, por lo que, por supuesto, cuando se ejecutan los métodos, los valores van a ser ''.

¿Es por eso que aparece el error "Datos truncados"? Parece diferente. No he visto el error truncado antes y es por eso que vengo a ustedes genios. Gracias.

+0

Mi corazonada es que MySQL espera que los valores que se escriban en un campo FLOAT sean al menos numéricos o NULL. ¿Has intentado usar NULL en lugar de ''? – jkndrkn

Respuesta

29

'' y null no son lo mismo. si su servidor mysql está en modo estricto, se negará a hacer la inserción ya que ha pasado datos no válidos para la columna. sin modo estricto, devuelve una advertencia.

mysql> create table a (a float not null); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert a values (''); 
Query OK, 1 row affected, 1 warning (0.05 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'a' at row 1 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> set sql_mode = 'STRICT_ALL_TABLES'; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert a values (''); 
ERROR 1265 (01000): Data truncated for column 'a' at row 1 

o bien inserte explícitas null s, o ni siquiera se especifica la columna en el inserto.

cuando está actualizando puede enviar todos los valores que tiene porque mysql automáticamente ignorará los sin cambios.

+0

Sí, puedo ver que necesito hacer eso. Pero con UPDATE no puede ser cierto, porque a menudo tiene un formulario que tiene todas las columnas del registro, pero solo actualiza uno o dos, y la aplicación no sabe cuáles se cambiaron, por lo que las actualiza todas, etc. Lo que me interesa es: ¿de dónde viene el error TRUNCATED? – rhodesjason

+0

ver mi ejemplo actualizado. el error truncado es mysql que le dice que no pudo convertir la cadena de longitud cero que le pasó a un valor numérico adecuado. – longneck

+0

Muy bien, esto es lo que necesitaba escuchar: es solo un problema durante la inserción y no durante la actualización. ¡Me estaba empezando a preocupar! Gracias. – rhodesjason

1

Si no va a INSERTAR los datos, no debería estar en la instrucción SQL.

Como ejemplo, supongamos que tiene una tabla "Datos" con id, float1, float2, float3 y float4, Float5, de la cual solo agregará la ID. El INSERT debe tener este aspecto:

INSERT INTO `Data` (`id`) 
VALUES ('Some-ID-Value') 

Si se definen los flotadores para aceptar NULL que irá automáticamente a NULL. Lo mismo ocurre con las instrucciones UPDATE, solo debe enumerar los campos que va a modificar.

1

Esto no pretende ser una solución, sino solo tal vez arrojar algo más de luz sobre el problema.

Si se agrega la palabra clave IGNORE a la declaración, y tratar de insertar '' (o cualquier cadena que no empiece con un número) en una columna de flotación, MySQL insertará el valor 0, en lugar del valor por defecto.

INSERT IGNORE INTO a_table (float_column) VALUE ('') 

INSERT IGNORE INTO a_table (float_column) VALUE ('abc') 

Ambos insertarán 0, incluso si el valor predeterminado es nulo. Sin IGNORE, por supuesto, ambas declaraciones aumentarán el error que estás viendo.

En resumen, aparece el mensaje porque los datos que está suministrando no son del tipo esperado ni del valor predeterminado.

Cuestiones relacionadas