mysql sql_mode简介

mysql有时候会遇到这样的问题

Expression #12 of SELECT list is not in GROUP BY clause and contains nonaggregated column '数据库.表.字段' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这常常发生在重启数据库或者转移数据库的时候。

这种情况基本是 MySQL 的sql_mode设置错误。

在数据库中你可以使用

 select @@global.sql_mode

来查询 。

set @@global.sql_mode ='内容'

来设置。

直接一下设置就行:

set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

具体讲解如下:

  • STRICT_TRANS_TABLES:启用了严格模式,只影响事务表,不影响非事务表,如果一个值不能写到事务表(例如存储引擎为InnoDB),就中断当前操作不影响非事务表(例如存储引擎为MYISAM)
  • STRICT_ALL_TABLES:启用STRICT_ALL_TABLES后,对所有引擎的表都启用严格模式
  • ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为开启这个模式后,双引号被解释为识别符
  • ALLOW_INVALID_DATES:这个模式启用后,将开启对日期的不完全检验,比如只检验月份是否在1~12,日期是否在1~31,这种检验对于date、datetime类型的是可以的,但是对于timestamp是没效果的
  • ERROR_FOR_DIVISION_BY_ZERO:在insert或者update过程中,如果数据除以0(或者MOD(
    x,0))会产生错误,如果没开启改模式,则数据除以0时,MySQL返回NULL值
  • HIGH_NOT_PRECEDENCE NOT:开启旧版本的表达式优先级,例如 Not a between b and c被解释为not (a between b and c),不过在MySQL的一些旧版本里是解释为(not a) between b and c的,如果要使用旧版本的这种,就要开启 HIGH_NOT_PRECEDENCE NOT
  • IGNORE_SPACE:忽略函数名和括号之间的空格,这个属性默认是不开启的,一般是不建议开启的,比如某些特殊情况才可以开启,比如 select count (1) from t; count之间有空格会报错,开启后就不会报错,不过一般是不会在函数和括号直接加空格的,除非有表名或者列名也命名为count,这种情况就要加空格,表名,这个count不是表名,而是函数名
  • NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户
  • NO_AUTO_VALUE_ON_ZERO:这个属性是设置对于自动增长的列不允许写0值,也写入了0或者null,不会写0,假如写入了0,数据表里本来没数据,就会写1,以此类推
  • NO_BACKSLASH_ESCAPES:反斜杆“”作为普通字符而非转义符
  • NO_DIR_IN_CREATE:在创建表时忽略所有INDEX DIRECTORY和DATE DIRECTORY的选项
  • NO_ENGINE_SUBTRACTION:用到的存储引擎被禁用或者未编译,就用默认的存储引擎,并且抛出异常,
  • NO_UNSIGNED_SUBTRACTION:启用这个属性后,两个unsigned类型相减返回signed类型
  • NO_ZERO_DATE:不允许写入为0格式的日期,比如“0000-00-00 00:00:00”,启用这个属性后,写入这种类型数据就会抛异常
  • NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零的情况
  • ONLY_FULL_GROUP_BY:如果select出现的列没有在group by中就会报错
  • PAD_CHAR_TO_FULL_LENGTH:对于char类型字段,查询时候不要截取空洞数据,所谓空洞数据就是自动填充0x20的数据
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值