SQL 模式控制 MySQL / MariaDB DBMS 引擎(数据库管理系统)理解语法并验证为其处理的数据的方式。我们可以将其与具有不同规则集的游戏进行比较,每个玩家在玩之前都必须同意。
UNO 类比
让我们以UNO纸牌游戏为例。有很多变体,但我们可以这样总结:
变体 | 影响 |
---|---|
双倍的 | 如果它们完全相同,每个玩家都可以同时放下几张牌 |
拦截 | 如果玩家的牌与刚刚放下的牌完全相同,他可以打出自己的牌,即使轮不到他 |
STRAIGHT_FLUSH | 如果每个玩家按照数字顺序并且颜色相同,则可以同时放下多张牌 |
在开始玩之前,定义uno_mode=DOUBLE,INTERCEPTION,这意味着该 STRAIGHT_FLUSH规则不适用。如果此规则在游戏后期激活,可能会导致牌桌出现问题,一些玩家可能在前几轮中处于劣势,可能不想再玩了。
管理数据的纸牌游戏?
SQL 模式的工作原理是这样的,但它不是指定如何打牌,而是指定在某些情况下要做什么:
- “2020-11-00”是有效日期(NO_ZERO_IN_DATE)吗?它更改了 DBMS 执行的数据验证。
- 是SELECT name FROM users GROUP BY first_name有效的查询 ( ONLY_FULL_GROUP_BY) 吗?它更改了允许的语法。
当 MariaDB 10.2 和 MySQL 5.7 发布时,规则发生了变化:
数据库管理系统 | 默认 SQL_Mode |
---|---|
玛丽亚数据库 10.1 | NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER |
玛丽亚数据库 10.2 | STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION |
MySQL 5.6 | NO_ENGINE_SUBSTITUTION |
MySQL 5.7 | 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 |
我们可以注意到,较新的版本保留了旧规则,但添加了新规则。这就是为什么当从 MariaDB 10.1 升级到 MariaDB 10.2 时,必须指定其数据库使用旧规则,而不是强制执行STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO.
具体来说
实际上,如果我的网站应该存储除法的结果,但分母是“0”,我的 MariaDB 10.1 默认 SQL 模式数据库的数据库将允许它并将结果存储为NULL. 我使用 MariaDB 10.2 默认 SQL 模式的数据库也将允许并存储一个NULL值,但会引发警告。如果还启用了严格模式,MariaDB 10.2 将抛出错误并且不存储任何内容。因此,更改 SQL 模式可能会破坏网站,因此应谨慎操作。
由于我们无法检查每个客户的每个网站的每一行代码,当计划进行更改默认 SQL 模式的 DBMS 重大升级时,会激活旧 SQL 模式,以确保您的网站不会受到影响。当然,您可以在 CloudDB 的“配置”选项卡中切换到新的默认 SQL 模式。但请记住,这适用于有经验的用户,建议坚持使用默认的 sql_mode,除非您的数据库是从具有不同默认 sql_mode 的先前版本升级的。