澳门在线威尼斯官方 > 电脑数据库 > MySQL系统变量

原标题:MySQL系统变量

浏览次数:116 时间:2019-11-16

  • 一 、声明
  • 二 、SQL_MODE参数值
  • 三 、设置 sql_mode

转载自:

一、 声明

    原文:https://segmentfault.com/a/1190000005936172

MySQL数据类型:SQL_MODE设置不容忽略

2012-08-23 00:05    it168网站原创  作者: 姜承尧 编辑: 王玉圆 

        【IT168 技术】SQL_MODE也许是比比较容易于让开垦人士和DBA忽略的三个变量,暗中同意为空。SQL_MODE的设置其实是相比冒险的生龙活虎种设置,因为在此种装置下得以允许一些不合法操作,举个例子能够将NULL插入NOT NULL的字段中,也足以插入一些违规日期,如“二零一二-12-32”。由此在生育条件中猛烈提议开垦职员将那些值设为严俊格局,那样某个难题得以在数据库的设计和开垦阶段就能够觉察,而固然在生育处境下运维数据库后开采那类难题,那么更正的代价将变得要命光辉。别的,正确地安装SQL_MODE还是能做一些束缚(Constraint)检查的办事。

  对于SQL_MODE的设置,能够在MySQL的配置文件如my.cnf和my.ini中进行,也得以在顾客端工具中开展,况且能够独家打开全局的设置或当前对话的设置。上面的指令可以用来查阅当前SQL_MODE的装置境况。

  mysql> SELECT @@global.sql_modeG; //查询全局的sql_mode变量值。

  *************************** 1. row ***************************

  @@global.sql_mode:

  1 row in set (0.00 sec)

  mysql> SELECT @@session.sql_modeG; //查询当前对话的sql_mode值。

或  

    SELECT @@sql_modeG

  *************************** 1. row ***************************

  @@session.sql_mode: NO_UNSIGNED_SUBTRACTION

  1 row in set (0.00 sec)

  能够见见方今全局的SQL_MODE设置为空,而近期对话的设置为NO_UNSIGNED_SUBTRACTION。通过以下语句能够将眼下的SQL_MODE设置为严刻情势。

  mysql> SET GLOBAL sql_mode='strict_trans_tables'; //设置全局的sql_mode值。

  Query OK, 0 rows affected (0.00 sec)

  也可以设置当前对话的SQL_MODE的值:

  mysql>SET SESSION SQL_MODE='PAD_CHAR_TO_FULL_LENGTH'; 或者

  mysql>SET SQL_MODE='PAD_CHAR_TO_FULL_LENGTH';

  严酷格局是指将SQL_MODE变量设置为ST奥德赛ICT_TRANS_TABLES或STRICT_ALL_TABLES中的最少意气风发种。以后来看一下SQL_MODE能够安装的选项。

  STRICT_TRANS_TABLES:在该方式下,假诺四个值不可能插入到三个事务表(比如表的存款和储蓄引擎为InnoDB)中,则中断当前的操作不影响非事务表(比方表的蕴藏引擎为MyISAM)。

  ALLOW_INVALID_DATES:该选项并不完全对日期的合法性进行检讨,只检查月份是或不是在1~12时期,日期是还是不是在1~3第11中学间。该方式仅对DATE和DATETIME类型有效,而对TIMESTAMP无效,因为TIMESTAMP总是必要一个法定的输入。

  ANSI_QUOTES:启用ANSI_QUOTES后,无法用双引号来引用字符串,因为它将被解释为识别符,示比如下:

  mysql> CREATE TABLE z ( a VARCHAR(10))ENGINE=INNODB;

  Query OK, 0 rows affected (0.00 sec)

  mysql>INSERT INTO z SELECT "aaa";

  Query OK, 1 rows affected (0.00 sec)

  mysql> SET sql_mode='ANSI_QUOTES';

  Query OK, 0 rows affected (0.00 sec)

  mysql> INSERT INTO z SELECT "aaa";

  ERROR 1054 (42S22): Unknown column 'aaa' in 'field list'

  ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE进度中,假如数额被零除(或MOD(X,0)),则发出错误(不然为警报)。借使未提交该情势,那么数量被零除时MySQL再次回到NULL。借使用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警报,但操作结果为NULL。

  HIGH_NOT_PRECEDENCE NOT:操作符的事先顺序是表明式。比如,NOT a BETWEEN b AND c被分解为NOT(a BETWEEN b AND c),在部分旧版本MySQL中, 前边的表明式被疏解为(NOT a)BETWEEN b AND c。启用HIGH_NOT_PRECEDENCE SQL形式,能够拿到早先旧版本的更加高优先级的结果。上面看叁个例子:

  mysql> SELECT 0 BETWEEN -1 AND 1G;

  *************************** 1. row ***************************

  0 BETWEEN -1 AND 1: 1

  1 row in set (0.00 sec)

  0在-1到1里面,所以回来1,假诺加上NOT,则重回0,进度如下:

  mysql> SELECT @@sql_modeG;

  *************************** 1. row ***************************

  @@sql_mode:

  1 row in set (0.00 sec)

  mysql> SELECT not 0 BETWEEN -1 AND 1G;

  *************************** 1. row ***************************

  NOT 0 BETWEEN -1 AND 1: 0

  1 row in set (0.00 sec)

  但是只要启用HIGH_NOT_PRECEDENCE方式,则SELECT NOT 0 BETWEEN -1 AND 1被解释为SELECT(NOT 0)BETWEEN -1 AND 1,结果就全盘相反,如下所示:

  mysql> SELECT NOT 0 BETWEEN -1 AND 1G;

  *************************** 1. row ***************************

  NOT 0 BETWEEN -1 AND 1: 1

  1 row in set (0.00 sec)

  从上述例子中仍是可以见到,在MySQL数据库中BETWEEN a AND b被降解为[a,b]。下边做三个轻松的测量检验。

  mysql> SELECT 1 BETWEEN -1 AND 1G;

  *************************** 1. row ***************************

  1 BETWEEN -1 AND 1: 1

  1 row in set (0.00 sec)

  mysql> SELECT -1 BETWEEN -1 AND 1G;

  *************************** 1. row ***************************

  -1 BETWEEN -1 AND 1: 1

  1 row in set (0.00 sec)

  IGNORE_SPACE:函数名和括号“(”之间有空格。除了扩张部分非常的慢,那一个选项好像从没任何功利,要拜会保存为重要字的数据库、表或列名,顾客务必援用该选项。比如某些表中有user这一列,而MySQL数据库中又有user这么些函数, user会被演讲为函数,若是想要采用user这一列,则必要援引。

  NO_AUTO_CREATE_USE福特Explorer:禁绝GRANT创制密码为空的顾客。

  NO_AUTO_VALUE_ON_ZERO:该选项影响列为自拉长的插入。在暗许设置下,插入0或NULL代表生成下三个自拉长值。假使客商期望插入的值为0,而该列又是自拉长的,那么这几个选项就有用了。

  NO_BACKSLASH_ESCAPES:反斜杠“”作为普通字符而非转义符,示举例下:

  mysql> SET sql_mode='';

  Query OK, 0 rows affected (0.00 sec)

  mysql> SELECT '\'G;

  *************************** 1. row ***************************

  : 

  1 row in set (0.00 sec)

  mysql> SET sql_mode='NO_BACKSLASH_ESCAPES';

  Query OK, 0 rows affected (0.00 sec)

  mysql> SET '\'G;

  *************************** 1. row ***************************

  \: \

  1 row in set (0.00 sec)

  NO_DIR_IN_CREATE:在开立表时忽略全数INDEX DIRECTO途观Y和DATA DIRECTO奥迪Q5Y的选项。

  NO_ENGINE_SUBSTITUTION:假若急需的蕴藏引擎被剥夺或未编写翻译,那么抛出错误。暗中认可用默许的存放引擎替代,并抛出多少个分外。

  NO_UNSIGNED_SUBTRACTION:此前早就介绍过,启用这几个选项后三个UNSIGNED类型相减重临SIGNED类型。

  NO_ZERO_DATE:在非严酷形式下,能够插入形如“0000-00-00 00:00:00”的越轨日期,MySQL数据库仅抛出一个警戒。而启用该选项后,MySQL数据库不容许插入零日期,插入零日期会抛出荒唐而非警示。

  NO_ZERO_IN_DATE:在严厉格局下,分歧意日期和月份为零。如“二零一三-00-01”和“二〇一二-01-00”那样的格式是不容许的。接纳日期或月份为零的格式时MySQL都会一向抛出荒诞而非警示,示比如下:

  mysql> SET sql_mode='NO_ZERO_IN_威尼斯澳门在线 ,DATE';

  Query OK, 0 rows affected (0.00 sec)

  mysql> CREATE TABLE a ( a DATETIME );

  Query OK, 0 rows affected (0.04 sec)

  mysql> INSERT INTO a SELECT '2011-01-00';

  ERROR 1292 (22007): Incorrect datetime value: '2011-01-00' for column 'a' at row 1

  ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,若是在SELECT中的列未有在GROUP BY中现身,那么那句SQL是违规的,因为a列不在GROUP BY从句中,示比方下:

  mysql> SET sql_mode='ONLY_FULL_GROUP_BY';

  Query OK, 0 rows affected (0.00 sec)

  mysql> SELECT a,SUM(b) FROM t GROUP BY b;

  ERROR 1055 (42000): 'test.t.a' isn't in GROUP BY

  PAD_CHAR_TO_FULL_LENGTH:对于CHA帕杰罗类型字段,不要截断空洞数据。空洞数据正是机动填充值为0x20的数额。先来看MySQL数据库在暗中同意景况下的变现。

  mysql> CREATE TABLE t ( a CHAR(10) );

  Query OK, 0 rows affected (0.04 sec)

  mysql> INSERT INTO t SELECT 'a';

  Query OK, 1 row affected (0.01 sec)

  Records: 1 Duplicates: 0 Warnings: 0

  mysql>SELECT a,CHAR_LENGTH(a),HEX(a) FROM tG;

  *************************** 1. row ***************************

  a: a

  CHAR_LENGTH(a): 1

  HEX(a): 61

  1 row in set (0.04 sec)

  能够见到,在暗中认可情状下,尽管a列是CHAENCORE类型,可是回去的长度是1,那是因为MySQL数据库已经对前面包车型大巴虚幻数据举办了截断。若启用PAD_CHAR_TO_FULL_LENGTH选项,则展示的是事实上存款和储蓄的内容,举例:

  mysql> SELECT a,CHAR_LENGTH(a),HEX(a) FROM tG;

  *************************** 1. row ***************************

  a: a

  CHAR_LENGTH(a): 10

  HEX(a): 61202020202020202020

  1 row in set (0.00 sec)

  能够看看在CHATucson列a中实际存储的值为0x61202020202020202020。

  PIPES_AS_CONCAT:将“||”视为字符串的连天操作符而非或运算符,那和Oracle数据库是相符的,也和字符串的拼接函数Concat相肖似,比方:

  mysql> SET sql_mode='pipes_as_concat';

  Query OK, 0 rows affected (0.01 sec)

  mysql> SELECT 'a'||'b'||'c'G;

  *************************** 1. row ***************************

  'a'||'b'||'c': abc

  1 row in set (0.00 sec)

  REAL_AS_FLOAT:将REAL视为FLOAT的同义词,并非DOUBLE的同义词。

  STRICT_ALL_TABLES:对具有引擎的表都启用严俊情势。(STSportageICT_TRANS_TABLES只对支撑专门的学问的表启用严格格局)。

  在从严方式下,生机勃勃旦其余操作的多寡发生难题,都会停止当前的操作。对于启用STRubiconICT_ALL_TABLES选项的非事务引擎来讲,此时数据只怕停留在二个未知的景观。那说不许不是持有非事务引擎愿意见见的生机勃勃种情景,由此须要充裕小心那么些选项大概带来的机密影响。

  上面的两种SQL_MODE设置是后边探讨的二种接收的构成。

  ANSI:等同于REAL_AS_FLOAT、PIPES_AS_CONCAT和ANSI_QUOTES、IGNORE_SPACE的组合。

  ORACLE:等同于PIPES_AS_CONCAT、 ANSI_QUOTES、IGNORE_SPACE、 NO_KEY_OPTIONS、 NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS和NO_AUTO_CREATE_USER的组合。

  TRADITIONAL:等同于STRICT_TRANS_TABLES、 STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、 ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER和 NO_ENGINE_SUBSTITUTION的组合。

  MSSQL:等同于PIPES_AS_CONCAT、 ANSI_QUOTES、 IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS和 NO_FIELD_OPTIONS的组合。

  DB2:等同于PIPES_AS_CONCAT、ANSI_QUOTES、 IGNORE_SPACE、NO_KEY_OPTIONS、 NO_TABLE_OPTIONS和NO_FIELD_OPTIONS的组合。

  MYSQL323:等同于NO_FIELD_OPTIONS和HIGH_NOT_PRECEDENCE的组合。

  MYSQL40:等同于NO_FIELD_OPTIONS和HIGH_NOT_PRECEDENCE的组合。

  MAXDB:等同于PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、 NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS和 NO_AUTO_CREATE_USER的组合。

本文由澳门在线威尼斯官方发布于电脑数据库,转载请注明出处:MySQL系统变量

关键词:

上一篇:没有了

下一篇:没有了