服务器SQL模式定义了MySQL应该支持的SQL语法和它应该执行哪种数据验证检查。使在不同环境中使用MySQL或将MySQL与其他数据库服务器一起使用变得更加容易。
DBA可设置全局的SQL模式以匹配站点服务器的操作要求,并且每个应用程序都可以根据自己的要求设置其会话 SQL 模式。MySQL8.0中默认SQL模式包括:ONLY_FULL_GROUP_BY
,STRICT_TRANS_TABLES
`,NO_ZERO_IN_DATE
,NO_ZERO_DATE
,ERROR_FOR_DIVISION_BY_ZERO
和NO_ENGINE_SUBSTITUTION
。
要在服务器启动时设置 SQL 模式,请使用命令行上的 --sql-mode="modes"
选项,或在my.cnfmy.ini文件中使用 sql-mode="modes"
。若要显示地清楚SQL模式,请在命令行使用--sql-mode=""
或在my.cnfmy.ini文件中配置sql-mode=""
。
要在运行时更改SQL模式,请使用以下命令:
set global sql_mode="modes"; #全局的设置影响连接的每一个客户端,
set session sql_mode="modes"; #会话级别的设置只影响当前的客户端,
(在命令行的设置重启服务后会失效)
以下列表描述了所有支持的 SQL 模式:
SQL模式 | 说明 |
---|---|
ALLOW_INVALID_DATES | 不对日期进行全面检查,仅检查月份在1到12的范围内,日期在范围1到31。此模式适用于DATE和DATETIME列。禁用ALLOW_INVALID_DATES 后,服务器要求月份和日期值必须合法,而不仅仅是月份在1到12或日期在1到31的范围内。 |
ANSI_QUOTES | 启用这个模式,不能使用双引号来引用字符创,因为双引号也被认为是一种标识字符创,可以使用单引号。 |
ERROR_FOR_DIVISION_BY_ZERO | 如果这个模式未启用,那么零除操作将会插入空值并且不会产生警告;如果这个模式启用,零除操作插入空值并产生警告;如果这个模式和严格模式都启用,零除从操作将会产生一个错误,除非使用来ignore来忽略错误。例如insert ignore和update ignore,这样的话零除操作将插入空并发出警告。ERROR_FOR_DIVISION_BY_ZERO不是严格模式的一部分,应该和严格模式一起启用,默认是启用的。 |
HIGH_NOT_PRECEDENCE | (高not优先级)在如下一个表达式中not a between b and c,在当前设置下被解析为not (a between b and c),在旧的行为中同一个表达式被解析为(not a) between b and c; |
IGNORE_SPACE | 用于忽略mysql系统函数名与之后括号之间的空格 |
NO_AUTO_VALUE_ON_ZERO | 这个值影响自增列,正常情况下可以通过插入“0”值或者null 来生成自增序列的下一个值。这个值影响自增列,正常情况下可以通过插入“0”值或者null 值来生成自增序列的下一个值 |
NO_BACKSLASH_ESCAPES | (禁用反斜线转义)这个模式启用,反斜线将会变成一个普通的字符串 |
NO_DIR_IN_CREATE | 在创建表时忽略所有的index directory和data directory选项。 |
NO_ENGINE_SUBSTITUTION | 此模式指定当执行create语句或者alter语句指定的存储引擎没有启用或者没有编译时,控制默认默认存储引擎的自动切换。默认是启用的。当NO_ENGINE_SUBSTITUTION被禁用,当create表时的默认存储引擎不可使用则产生警告信息,对于alter语句产生警告并且表不会被alter。当NO_ENGINE_SUBSTITUTION启用,会生成错误并且表不会被创建或alter如果期望的存储引擎不可用 |
NO_UNSIGNED_SUBTRACTION | 在整型数值之间的减法,一个值得类型是unsigned的,那么默认结果也是unsigned的。若是结果是一个负数,则会产生一个错误。 |
NO_ZERO_DATE | 这个模式影响着插入的’0000-00-00’值是否作为合法的数值,这个结果和是否启用严格模式有关。如果这个模式禁用,则’0000-00-00’被允许并且插入没有警告,如果这个模式启用,则’0000-00-00’被运行并且插入产生一个警告信息;如果这个模式和严格模式被启用,则’0000-00-00’不被允许并且插入产生错误,除非ignore被使用。 |
NO_ZERO_IN_DATE | 这个模式影响着日期中的月份和天数是否可以为0(注意年份是非0的),这个模式也取决于严格模式是否被启用。如果这个模式未启用,date中的零部分被允许并且插入没有警告。如果这个模式启用,dates中的零部分插入被作为“0000-00-00”并且产生一个警告。如果这个模式和严格模式被启用,则dates中的零部分不被允许并且插入产生错误,除非ignore也被使用 |
ONLY_FULL_GROUP_BY | 这个模式对查询的影响有点大。mysql5.7默认启用这个模式,这个模式是指在mysql的select查询不能出现除group by语句字段之外的其余字段,不存在于group_by中的字段需要使用,可以使用聚合函数。 |
PAD_CHAR_TO_FULL_LENGTH | 默认情况下,会自动修剪char列的空格。但是若这个模式启用,不会修剪空格,会自动补全。这个模式对varchar字段不起作用。 |
REAL_AS_FLOAT | 将real作为float的同义词。默认的,mysql将real作为double的同义词。 |
STRICT_ALL_TABLES | 启动严格模式未所有的存储引擎,不合法的数据将会被拒绝。STRICT_ALL_TABLES模式将包含: ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE 模式。 |
STRICT_TRANS_TABLES | 启动严格模式未事务存储引擎,STRICT_TRANS_TABLES将包含 ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE 模式的影响。 |