说明
该变量从 V1.4 版本开始引入。
功能描述
sql_mode 用于设置 SQL 模式,不同的 SQL 模式对于数据库行为有很大影响。
说明
该变量仅适用于 OceanBase 数据库 MySQL 模式。
权限要求
查询变量
Global 级别
sys 租户和所有用户租户均可以使用 SHOW VARIABLES 语句或视图 information_schema.GLOBAL_VARIABLES(MySQL 模式)查看 Global 系统变量的值。
Session 级别
sys 租户和所有用户租户均可以使用 SHOW VARIABLES 语句或视图 information_schema.SESSION_VARIABLES(MySQL 模式)查看 Session 系统变量的值。
修改变量
属性说明
| 属性 |
描述 |
| 参数类型 |
Uint |
| 默认值 |
STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER
说明
- 对于 V4.3.x 版本,从 V4.3.0 版本开始默认值由
STRICT_ALL_TABLES,NO_ZERO_IN_DATE 调整为 STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER。
- 对于 V4.2.x 版本,从 V4.2.1 BP1 版本开始默认值由
STRICT_ALL_TABLES,NO_ZERO_IN_DATE 调整为 STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER。
|
| 取值范围 |
取值可以为以下几个值的任意组合:
- 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。
- HIGH_NOT_PRECEDENCE:NOT 运算符的优先级使得
NOT a BETWEEN b AND c 等表达式被解析为 NOT(a BETWENE b AND c)。
- IGNORE_SPACE:在函数名称和字符之间允许有空格,该字段目前只用于兼容,可以设置但不生效。
- NO_AUTO_CREATE_USER:不允许使用 GRANT 语句创建密码为空的用户。
- NO_DIR_IN_CREATE:指创建表时忽略所有 INDEX DIRECTORY 和 DATA DIRECTORY 指令,该字段目前只用于兼容,可以设置但不生效,且在 OceanBase 数据库中的行为与 MySQL 不一致。
- NO_ENGINE_SUBSTITUTION:使用的存储引擎被禁用或未编译时,会报错。未设置该取值时,会采用默认的存储引擎代替,并显示异常。该字段目前只用于兼容,可以设置但不生效,且在 OceanBase 数据库中的行为与 MySQL 不一致。
- NO_FIELD_OPTIONS:不能在
SHOW CREATE TABLE 的输出中打印 MySQL 模式特定的列选项。
- NO_KEY_OPTIONS:不能在
SHOW CREATE TABLE 的输出中打印 MySQL 模式特定的索引选项。
- NO_TABLE_OPTIONS:不能在
SHOW CREATE TABLE 的输出中打印 MySQL 模式特定的表选项(例如 ENGINE)。
- NO_UNSIGNED_SUBTRACTION:默认情况下,整数值之间的减法(其中一个为 UNSIGNED 类型)会产生无符号结果。
- 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:只允许 SELECT 列表、HAVING 条件或 ORDER BY 列包含由 GROUP BY 列唯一确定的列。
- PIPES_AS_CONCAT:将(||)视为字符串连接运算符(与 CONCAT() 相同),而不是 OR 的同义词。
- PAD_CHAR_TO_FULL_LENGTH:在 CHAR 检索时保留列的末尾空格。并且检索到的 CHAR 值将填充到它们的全长。
- REAL_AS_FLOAT:默认情况下将 REAL 视为 DOUBLE 的同义词。设置后将 REAL 视为 FLOAT 的同义词。
- STRICT_ALL_TABLES:为所有存储引擎启用严格 SQL 模式,拒绝无效的数据值。
- STRICT_TRANS_TABLES:为事务存储引擎启用严格 SQL 模式,并且在可能的情况下为非事务存储引擎启用严格 SQL 模式。
- TIME_TRUNCATE_FRACTIONAL:控制在将具有小数秒部分的 TIME、DATE 或 TIMESTAMP 值插入到具有相同类型但小数位数较少的列中时,是否发生四舍五入。默认为舍入,如果启用此模式,则会舍弃。
- ANSI:相当于 REAL_AS_FLOAT、 PIPES_AS_CONCAT、 ANSI_QUOTES、 IGNORE_SPACE和 ONLY_FULL_GROUP_BY 之间的组合。
- DB2:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 之间的组合。
- MAXDB:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER 之间的组合。
- MSSQL:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 之间的组合。
- MYSQL323:相当于 HIGH_NOT_PRECEDENCE 中增加了一些 MYSQL323 的特性。
- MYSQL40:相当于 HIGH_NOT_PRECEDENCE 中增加了一些 MYSQL40 的特性。
- ORACLE:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER 之间的组合。
- POSTGRESQL:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 之间的组合。
|
| 生效范围 |
|
| 是否可修改 |
是,支持通过 SET 语句修改。 |
配置示例
将 SQL 模式设置为 STRICT_ALL_TABLES、NO_ZERO_IN_DATE 和 NO_AUTO_CREATE_USER。
Session 生效
obclient> SET sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER';
Global 生效
obclient> SET GLOBAL sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER';
相关文档
INFORMATION_SCHEMA TRIGGERS