MySQL8.0常见问题:服务器SQL模式

服务器SQL模式定义了MySQL应该支持的SQL语法和它应该执行哪种数据验证检查。使在不同环境中使用MySQL或将MySQL与其他数据库服务器一起使用变得更加容易。

DBA可设置全局的SQL模式以匹配站点服务器的操作要求,并且每个应用程序都可以根据自己的要求设置其会话 SQL 模式。MySQL8.0中默认SQL模式包括:ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLES`,NO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_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 模式的影响。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值