mysql中sql_mode设置引起的一些问题

以only_full_group_by 为例,其他的设置看每个设置的意思就懂了。

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因: mysql 使用group by语句的时候,group by子句中必须包含所有select的非聚合列, 否则就会提示这个错误。

聚合列类似(SUM,AVG,MAX,MIN) 这种计算得出的列。

MySQL 5.7.5之后的版本实现了对功能依赖的检测。如果启用了ONLY_FULL_GROUP_BY 模式(默认情况下是这样),那么MySQL就会校验 group by子句后的列名,必须和select的所有非聚合列都对应。

修改mysql的模式,

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)

mysql> set global sql_mode= 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)

set session sql_mode :

这种修改方式,只在当前session作用域有效。关闭重新打开后失效。

set global sql_mode:

这种修改方式,只在该次mysql服务运行期间有效,重启mysql后失效。

所以最好修改mysql的配置文件。

windows是在mysql安装目录下,新建(如果有就修改)一个my.ini 文件,里面设置sql_mode;

linux 是/etc/my.cnf 文件中 [mysqld] 下面设置sql_mode

sql-mode 值的一些解释

ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中
STRICT_TRANS_TABLES 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制
NO_ZERO_IN_DATE 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。
NO_ZERO_DATE 在严格模式,不要将 ‘0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告
ERROR_FOR_DIVISION_BY_ZERO 在严格模式,在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错误。

你可能感兴趣的:(mysql)