sql >> Base de Datos >  >> RDS >> Mysql

ER_TRUNCATED_WRONG_VALUE:valor de fecha y hora incorrecto

Aparentemente, el valor de fecha y hora no es un MySQL Datetime válido . Pero hay una solución para modificar los Modos SQL del servidor .

Por alguna razón, en mi servidor de desarrollo, las configuraciones del modo predeterminado de MySQL se eliminaron por completo. Por lo tanto, no había restricciones sobre cómo podía insertar la fecha y hora.

mysql> select @@sql_mode;
    +------------+
    | @@sql_mode |
    +------------+
    |            |
    +------------+
    1 row in set (0.00 sec)

En el servidor de producción, por otro lado, había un montón de restricciones que le decían al servidor mysql qué tipo de formatos de fecha y hora aceptar.

mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

Este no es un método seguro, pero cambié los modos de restricción de MySQL a no_engine_substitution , y listo, todo funciona a las mil maravillas (casi). Tienes que cambiar los modos GLOBAL y SESSION para que esto funcione.

El modo SQL estándar es 'NO_ENGINE_SUBSTITUTION', así que pondremos el modo en eso. Hay más modos que podría agregar duro:

SET GLOBAL sql_mode = '<mode>';
SET SESSION sql_mode = '<mode>';

Ahora el modo GLOBAL y SESSION debe establecerse en NO_ENGINE_SUBSTITUTION

mysql> SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
mysql> SELECT @@SESSION.sql_mode;
+------------------------+
| @@SESSION.sql_mode     |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

mysql> SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
mysql> SELECT @@GLOBAL.sql_mode;
+------------------------+
| @@GLOBAL.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)