MySQL运维实战(4.2) 关于SQL_MODE
早期mysql对一些不符合SQL标准的SQL语句和数据的容忍度比较高。
mysql 5.7 修改了默认sql mode。系统从低版本升级或迁移到高版本时,需要经过全面的测试,避免影响程序的正常运行。
5.7 默认SQL_MODE
mysql> show global variables like '%sql_mode%'\G *************************** 1. row *************************** Variable_name: sql_mode Value: 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
SQL_MODE | 描述 |
ONLY_FULL_GROUP_BY | 使用group by的SQL语句,select不在group by列表中的字段,需要使用聚合函数。 |
STRICT_TRANS_TABLES | 严格模式,不允许非法数据写入到数据库中的事物型存储引擎(innodb) |
NO_ZERO_IN_DATE | 日期中不允许出现年、月或日为0的情况 |
NO_ZERO_DATE | 不允许0000-00-00的日期 |
ERROR_FOR_DIVISION_BY_ZERO | 除数为0时报错。 |
NO_AUTO_CREATE_USER | grant语句不自动创建用户 |
NO_ENGINE_SUBSTITUTION | 建表指定的engine不存在时报错 |
除了5.7默认设置的这些SQL_MODE,还有一些SQL_MODE也值得关注:
其他SQL_MODE
SQL_MODE | 描述 |
NO_BACKSLASH_ESCAPES | 反斜杠(\)不用作转义符 |
NO_UNSIGNED_SUBTRACTION | unsigned整数参与到减法中时,不转换成unsigned。允许结果为负数。 |
PIPES_AS_CONCAT | 使用|| 作为字符串连接的操作符号 |
ALLOW_INVALID_DATES | 允许非法日期,如2021-02-31 |
ANSI_QUOTES | 双引号(")可用做标识符(如表名、字段名)引用 |
后续分别测试这些SQL_MODE的影响。