升级 mysql5.6 配置文件my.cnf sql_mode 解析与设置问题

sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是能够容许一些非法操做的,好比容许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,因此开发、测试环境的数据库也必需要设置,这样在开发测试阶段就能够发现问题 mysql

1.sql_mode值的含义

ONLY_FULL_GROUP_BYsql

对于GROUP BY聚合操做,若是在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,由于列不在GROUP BY从句中数据库

STRICT_TRANS_TABLESsession

在该模式下,若是一个值不能插入到一个事务表中,则中断当前的操做,对非事务表不作任何限制函数

NO_ZERO_IN_DATE测试

在严格模式,不接受月或日部分为0的日期。若是使用IGNORE选项,咱们为相似的日期插入'0000-00-00'。在非严格模式,能够接受该日期,但会生成警告。spa

NO_ZERO_DATE命令行

在严格模式,不要将 '0000-00-00'作为合法日期。你仍然能够用IGNORE选项插入零日期。在非严格模式,能够接受该日期,但会生成警告code

ERROR_FOR_DIVISION_BY_ZEROblog

在严格模式,在INSERT或UPDATE过程当中,若是被零除(或MOD(X,0)),则产生错误(不然为警告)。若是未给出该模式,被零除时MySQL返回NULL。若是用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操做结果为NULL。

NO_AUTO_CREATE_USER

防止GRANT自动建立新用户,除非还指定了密码。

NO_ENGINE_SUBSTITUTION

若是须要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。

mysql5.0以上版本支持三种sql_mode模式:

ANSI模式

宽松模式,对插入数据进行校验,若是不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。

TRADITIONAL模式

严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。

STRICT_TRANS_TABLES模式

严格模式,进行数据的严格校验,错误数据不能插入,报error错误。

咱们能够经过如下方式查看当前数据库使用的sql_mode:

mysql> select @@sql_mode;

或者经过查看系统变量方式:
mysql> show variables like 'sql_mode%';

2.今天升级mysql5.6后程序警告

原来mysql 5.6版本后将mysql数据库的sql_mode默认设置了ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES等值,
因此致使以前sql中有group by等函数的sql不能正常执行, 如需解决此问题只需在本地mysql命令行中使用set @@sql_mode
='';便可解决此问题, 可是此方法并非根本解决方案,这样更改数据库模式都是session级别的,一次性,当你的mysql再次重启后又会出现此问题, 因此最根本解决方案是在 /etc/mysql5.*/目录下数据库配置文件my.cnf(Windows是my.ini)中的 [mysqld] 下添加 sql_mode='' 而后重启mysql便可,以下图:

推荐在my.cnf添加以下配置
[mysqld]
sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'
相关文章
相关标签/搜索