MySQL的SQL模式设定(sql_mode系统变量)

Posted 董哥的黑板报

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的SQL模式设定(sql_mode系统变量)相关的知识,希望对你有一定的参考价值。

一、SQL模式介绍

  • mysql服务器的SQL模式对SQL语句的执行会产生几个方面的影响

sql_mode系统变量

  • 服务器的SQL模式。这个变量将改变MySQL服务器的某些行为,使它更符合SQL语言标准或是与其他数据库服务器或老版本的MySQL服务器保持兼容。此变量的值应该是一个空串(这将清除以前设置的SQL模式)或者是由下面会介绍的一个或多个模式值以逗号分隔而构成的一系列值。
  • 自MySQ 5.6.6起,其默认值为NO_ENGINE_SUBSTITUTION;而对于之前的版本,其值为空串。有些模式值很简单,它们可以单独使用以启用某种特定的行为。其他的则是复合模式,每种复合SQL模式涵盖多种简单SQL模式,这使得用户可以方便地一次设置多种SQL模式。
  • sql_mode有不同的取值,影响着客户端的行为
  • sql_mode可以设置为全局的,这样对所有的客户端都有影响;也可以针对于客户端做限制

二、sql_mode取值

  • 下面列出一些常见的SQL模式值:
    • STRICT_ALL_TABLES、STRICT_TRANS_TABLES:启用"严格"模式。在该模式下,MySQL服务器将会更加严格地对待接受到的坏(bad)数据。(具体来讲,它不会把这些坏数据值转换为最为接近的有效值,而是拒绝接受它们)。
    • TRADITIONAL:组合模式。它类似于严格模式,但它还会启用几种其他模式,这些模式会引入更多的附加限制条件,从而实现更加严格的数据检查。TRADITIONAL模式可以让MySQL服务器在处理坏数据时,其行为更接近于那些传统的SQL服务器。
    • ANSI_QUOTES:该模式会告诉服务器,把双引号识别为一个标识符引用字符。
    • PIPES_AS_CONCAT:该模式下会让服务器把"||"当成一个标准的SQL字符串连接运算符,而不会把它当成是OR运算符的同义词。
    • ANSI:也是一个组合模式。它会同时启用ANSI_QUOTES、PIPES_AS_CONCAT和其他的几个模式值,其结果是让MySQL服务器的行为比它的默认运行状态更接近于标准SQL。

  • 下图列出的是复合SQL模式,以及每种复合模式所包含的模式内容:

  • 之所以称之为TRANITIONAL模式,是因为它启用这样的模式——它们使得MySQL在处理输入值时,可以表现得像那些会拒绝无效数据的传统数据库一样。它有点像严格模式,但是对于更加严格的检查又包含几个附加约束。

三、sql_mode设置

  • sql_mode的设置注意事项:
    • 在设置SQL模式时,可以指定一个模式值,或者多个模式值(由逗号分隔)。
    • 当给sqlo_mode赋值空串时,表示清除模式值。
    • 模式值不区分大小写。

全局设置

  • 可以在启动mysql的时候设置sql_mode。例如:
mysqld --sql_mode="TRADITIONAL"
mysqld --sql_mode=ANSI_QUOTES,PIPES_AS_CONCAT""
  • 也可以在mysql配置文件中配置
  • 或者在进入mysql之后,通过GLOBAL关键字设置全局sql_mode。设置全局变量需要具备SUPER管理权限。设置完成之后此后连入客户端都使用该配置。例如:
SET GLOBAL sql_mode=`TRADITIONAL`;

针对于单次会话设置

  • 可以在会话中设置sql_mode,那么该sql_mode仅针对于该客户端有效,且会话结束后失效
  • 例如:
SET sql_mode=`TRADITIONAL`;

四、查看

  • 例如,查看当前会话的SQL模式值:
SELECT @@SESSION.sql_mode;

  • 例如,查看全局的SQL模式值:
SELECT @@GLOBAL.sql_mode;

以上是关于MySQL的SQL模式设定(sql_mode系统变量)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的SQL模式设定(sql_mode系统变量)

MySQL的SQL模式设定(sql_mode系统变量)

MySQL的SQL模式设定(sql_mode系统变量)

Mysql的sql_mode

MySQL的sql_mode模式

mysql5.6 sql_mode设置为宽松模式