Mysql sql_mode参数配置

今天在使用数据库查询时使用了Group语句,遇到问题:

SELECT t1.UnderlyingInstrumentID, t2.*
FROM `t_OptionInstrument` t1
LEFT JOIN t_Instrument t2 ON t2.InstrumentID = t1.UnderlyingInstrumentID
GROUP BY t1.UnderlyingInstrumentID
> 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'History.t2.ExchangeID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
> 时间: 0.017s

从错误信息可以看出是因为设置了sql_mode=ONLY_GROUP_BY参数导致的,看起来这个参数是将select 的内容严格限制在Group By 的参数集中。要解决这个问题,需要把这个参数移除掉。

可以使用以下命令查看自己的slq_mode:

SELECT @@global.sql_mode;
#或者
show variables like 'sql_mode';

查出来结构如下:

mysql> select @@global.sql_mode;
+----------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                  |
+----------------------------------------------------------------------------------------------------+
| 
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

可以看到这里面第一个就是ONLY_FULL_GROUP_BY。

这里可以通过重设全局模式参数值:

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

把sql_mode参数里面ONLY_FULL_GROUP_BY移除掉,这种方式只能临时解决,如果mysql重启后,就会失效。

我们可以通过将其添加到配置文件中的方式,来达到每次启动都生效。Ubuntu下mysql配置文件路径通常在 /etc/mysql/mysql.conf.d/mysqld.cnf 位置。在其中加入如下配置:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后重启mysql即可。

既然遇到了这个sql_mode的问题,就顺便一起看看另外几个模式参数的作用吧。

ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
STRICT_TRANS_TABLES:如果一个值不能插入到一个事务中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE:不允许日期和月份为零
NO_ZERO_DATE:mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO:在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时Mysql返回NULL
NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户
NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
PIPES_AS_CONCAT:将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat想类似
ANSI_QUOTES:不能用双引号来引用字符串,因为它被解释为识别符

相关推荐

  1. Spring boot 配置参数

    2023-12-24 18:36:04       38 阅读
  2. mysql参数配置binlog

    2023-12-24 18:36:04       48 阅读
  3. jvm参数配置

    2023-12-24 18:36:04       51 阅读
  4. DORIS参数配置

    2023-12-24 18:36:04       34 阅读
  5. mysql常见配置文件参数

    2023-12-24 18:36:04       53 阅读
  6. Spark_spark参数配置优先级

    2023-12-24 18:36:04       69 阅读
  7. Mysql sql_mode参数配置

    2023-12-24 18:36:04       61 阅读
  8. mysql从节点参数配置

    2023-12-24 18:36:04       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-24 18:36:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-24 18:36:04       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-24 18:36:04       82 阅读
  4. Python语言-面向对象

    2023-12-24 18:36:04       91 阅读

热门阅读

  1. sql server多表查询

    2023-12-24 18:36:04       63 阅读
  2. 9.9算法

    2023-12-24 18:36:04       52 阅读
  3. 力扣(leetcode)13和14题(Python)

    2023-12-24 18:36:04       62 阅读
  4. 在C#中使用OpenCV获取图像的轮廓

    2023-12-24 18:36:04       63 阅读
  5. 文盘Rust -- 本地库引发的依赖冲突

    2023-12-24 18:36:04       68 阅读
  6. 内网穿透之FRP

    2023-12-24 18:36:04       58 阅读
  7. uniapp点击tabbar之前做判断

    2023-12-24 18:36:04       70 阅读
  8. Program专栏启动计划

    2023-12-24 18:36:04       68 阅读
  9. 贪心算法高频问题-区间问题

    2023-12-24 18:36:04       48 阅读
  10. vue 项目 index.html 中使用环境变量

    2023-12-24 18:36:04       59 阅读
  11. 语音信号加密算法MATLAB仿真

    2023-12-24 18:36:04       72 阅读