MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
586 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

06|SQL Mode对程序有怎样的影响?

你好,我是俊达。
SQL Mode 是 MySQL 中比较特殊的一个概念,可以通过参数 sql_mode 进行设置。设置 SQL Mode 会影响数据库对 SQL 的语法支持,也会影响数据写入时的校验规则。早期的 MySQL 使用非严格模式,这样有一些不符合 SQL 标准的语句在 MySQL 中也能执行,一些按 SQL 标准来说不合法的数据,也能写到表里面。
不过从 MySQL 5.7 开始,默认就开启了严格模式。这一讲中,我们一起来看看 SQL Mode 是怎么影响到 SQL 语句的,以及应该怎么设置 SQL Mode。

非严格模式

非严格模式下,MySQL 会允许你执行一些不符合 SQL 标准的语句。我们通过一些例子来说明这种情况。先创建一个测试表,写入一些数据。
mysql> create table tab2(
b int,
c varchar(10),
d varchar(30)
) engine=innodb;
Query OK, 0 rows affected (10.16 sec)
mysql> insert into tab2 values
(10, 'AAA1', 'BBB1'),
(20, 'AAA4', 'BBB4'),
(10, 'AAA3', 'BBB3'),
(20, 'AAA2', 'BBB2')
Query OK, 4 rows affected (0.56 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from tab2;
+------+------+------+
| b | c | d |
+------+------+------+
| 10 | AAA1 | BBB1 |
| 20 | AAA4 | BBB4 |
| 10 | AAA3 | BBB3 |
| 20 | AAA2 | BBB2 |
+------+------+------+
4 rows in set (0.00 sec)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. SQL Mode对MySQL中的语法支持和数据写入校验规则产生影响,早期MySQL使用非严格模式,但从MySQL 5.7开始默认开启严格模式。 2. 在非严格模式下,MySQL允许执行不符合SQL标准的语句,而在严格模式下,会对数据写入时的合法性进行严格校验。 3. SQL Mode中的选项包括ONLY_FULL_GROUP_BY和STRICT_TRANS_TABLES,设置ONLY_FULL_GROUP_BY后,对有GROUP BY的SQL,SELECT的字段要么也出现在GROUP BY中,要么使用聚合函数,否则SQL执行会报错。 4. 设置STRICT_TRANS_TABLES后,在数据写入时,如果数据不符合字段定义,比如字符串超出长度,或者数值类型数据超出范围时,SQL会报错。 5. SQL Mode的默认设置可以通过设置sql_mode=default来获取,其中包括了一系列选项,如ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES等。 6. SQL Mode的设置对数据库的语法支持和数据写入校验规则产生重要影响,需要根据实际需求进行合理设置。 7. 在MySQL 5.6及更早版本中,默认使用非严格模式,而在MySQL 5.7及之后版本,默认开启严格模式,这可能导致原先正常的应用程序无法正常运行。 8. SQL Mode的设置对数据库的数据完整性和合法性起到重要作用,需要根据具体情况进行合理选择和配置。 9. SQL Mode的各种选项对数据库的数据写入和查询操作产生重要影响,需要根据实际情况进行灵活配置。 10. 设置SQL_MODE可能会使原先能执行的SQL无法执行,也可能影响数据写入操作,因此在生产环境修改这个参数前,需要对应用进行完整的测试验证。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 123
    思考题: 首先查看数据库的版本是否一致,mysql在5.7默认开启严格模式,通过show variables like 'innodb_strict_mode'查看,当前情况下,主库是在非严格模式下,而备库在严格模式下 解决方案: 1、设置备库为非严格模式,除非是业务需求,尽量不要使用非严格模式 2、修改主库表的DDL,开启严格模式(在业务改动不大的情况下),让备库忽略该GTID,不执行该语句,后由主库重新创建后会自动同步 另外,请教下老师,非严格模式使用会多吗,我们生产要求必须要使用严格模式

    作者回复: 思考题里那个问题就是参数innodb_strict_mode在主备库不一样引起的。 一般都建议用严格模式,这样能尽早暴露错误。warning很多时候都会被忽略。

    2024-08-30归属地:新加坡
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)