Mysql
 sql >> Base de données >  >> RDS >> Mysql

ER_TRUNCATED_WRONG_VALUE :valeur de date/heure incorrecte

Apparemment, la valeur datetime n'est pas un MySQL Datetime valide . Mais il existe un moyen de modifier les Modes SQL du serveur .

Pour une raison quelconque, sur mon serveur de développement, les configurations du mode MySQL par défaut ont été complètement supprimées. Par conséquent, il n'y avait aucune restriction sur la façon dont je pouvais insérer la date et l'heure.

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

D'un autre côté, sur le serveur de production, il y avait une tonne de restrictions qui indiquaient au serveur mysql quels types de formats datetime accepter.

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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

Ce n'est pas une méthode sûre, mais j'ai changé les modes de restriction MySQL en no_engine_substitution , et voilà, tout fonctionne comme un charme (presque). Vous devez changer les modes GLOBAL et SESSION pour que cela fonctionne.

Le mode SQL standard est 'NO_ENGINE_SUBSTITUTION', nous allons donc mettre le mode à cela. Il y a plus de modes que vous pourriez ajouter :

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

Maintenant, les modes GLOBAL et SESSION doivent être définis sur 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)