sql_mode 用于设置 SQL 模式,不同的 SQL 模式对于数据库行为有很大影响。
| 属性 |
描述 |
| 参数类型 |
varchar |
| 默认值 |
STRICT_ALL_TABLES,NO_ZERO_IN_DATE |
| 取值范围 |
取值可以为以下几个值的任意组合:
- ANSI_QUOTES:将字符串引号字符(双引号 ”)当成标识符引号字符(反引号 ` )来使用,故不能使用双引号来引用字符串。
- ERROR_FOR_DIVISION_BY_ZERO:使用 INSERT 或 UPDATE 语句时,数据被零除,会产生错误。
- 未启用 ERROR_FOR_DIVISION_BY_ZERO 模式时,数据被零除,返回 NULL。
- 启用 ERROR_FOR_DIVISION_BY_ZERO 模式,但未启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )时,数据被零除,返回 NULL。
- 同时启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )和 ERROR_FOR_DIVISION_BY_ZERO 模式时,不允许数据被零除,并产生报错。
- 同时启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )和 ERROR_FOR_DIVISION_BY_ZERO 模式,且指定了 ignore 时,数据被零除,返回 NULL。
- NO_AUTO_CREATE_USER:不允许使用 GRANT 语句创建密码为空的用户。
- NO_ENGINE_SUBSTITUTION:使用的存储引擎被禁用或未编译时,会报错。未设置该取值时,会采用默认的存储引擎代替,并显示异常。该字段目前只用于兼容。
- NO_ZERO_DATE:是否允许 '0000-00-00' 形式的日期。
- 未启用 NO_ZERO_DATE 模式时,允许 '0000-00-00' 形式的日期。
- 启用 NO_ZERO_DATE 模式,但未启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )时,允许 '0000-00-00' 形式的日期。
- 同时启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )和 NO_ZERO_DATE 模式时,不允许 '0000-00-00' 形式的日期,并产生报错。
- 同时启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )和 NO_ZERO_DATE 模式,且指定了 ignore 时,允许 '0000-00-00' 形式的日期。
- NO_ZERO_IN_DATE:允许年份非 0,月或日为 0 形式的日志(如:'2010-00-01' 或 '2010-01-00' )。
- 未启用 NO_ZERO_IN_DATE 模式时,允许年份非 0,月或日为 0 形式的日期。
- 启用 NO_ZERO_IN_DATE 模式,但未启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )时,年份非 0,月或日为 0 形式的日期会转为 '0000-00-00' 形式的日期。
- 同时启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )和 NO_ZERO_IN_DATE 模式时,不允许年份非 0,月或日为 0 形式的日期,并产生报错。
- 同时启用严格 SQL 模式( STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES )和 NO_ZERO_IN_DATE 模式,且指定了 ignore 时,年份非 0,月或日为 0 形式的日期会转为 '0000-00-00' 形式的日期。
- ONLY_FULL_GROUP_BY:查询需要满足的条件:选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列,这些列既不在 GROUP BY 子句中命名,也不在功能上依赖于唯一确定的 GROUP BY 列。
- PAD_CHAR_TO_FULL_LENGTH:在 CHAR 检索时保留列的末尾空格。并且检索到的 CHAR 值将填充到它们的全长。
- STRICT_ALL_TABLES:为所有存储引擎启用严格 SQL 模式,拒绝无效的数据值。
- STRICT_TRANS_TABLES:为事务存储引擎启用严格 SQL 模式,并且在可能的情况下为非事务存储引擎启用严格 SQL 模式。
|
| 生效范围 |
GlobalSession |
将当前会话的 SQL 模式设置为 STRICT_ALL_TABLES,STRICT_TRANS_TABLES 。示例如下:
obclient>SET SESSION sql_mode = 'STRICT_ALL_TABLES,STRICT_TRANS_TABLES';