在使用MySQL 5.7版本时,已经碰到了两起因为SQL_MODE的改变而导致的问题了,究其原因都是因为MySQL 5.7控制的更加严格了,所以在MySQL 5.6或MySQL 5.5有些SQL语句就无法在MySQL 5.7执行了(会给开发带来一个很诡异的问题,就是代码一样、环境一样、SQL一样、测试跟正式怎么就报错呢?)。
说一下我碰到的两起事件:
某些GROUP BY的SQL语句无法执行了。
创建表时使用日期数据类型指定的默认值为0000-00-00时报错。
先看一下,MySQL 5.6&MySQL 5.7默认的SQL模式。
# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.7 Default SQL_MODE;
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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# MySQL 5.6 Default SQL_MODE;
mysql>select@@sql_mode;
+--------------------------------------------+
|@@sql_mode|
+--------------------------------------------+
|STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION|
+--------------------------------------------+
1rowinset(0.00sec)
# MySQL 5.7 Default SQL_MODE;
mysql>select@@sql_mode;
+-----------------------