SQL_MODEæ¯MySQLä¸çä¸ä¸ªç³»ç»åé(variable)ï¼å¯ç±å¤ä¸ªMODEç»æï¼æ¯ä¸ªMODEæ§å¶ä¸ç§è¡ä¸ºï¼å¦æ¯å¦å è®¸é¤æ°ä¸º0ï¼æ¥æä¸æ¯å¦å 许'0000-00-00'å¼ã
为ä»ä¹éè¦å ³æ³¨SQL_MODEå¢ï¼
é¦å ï¼çä¸ä¸ªç®åçDemo(MySQL 5.6)ã
1.
mysql>create table t1(c1 datetime);
Query OK,0 rows affected (0.16sec)
mysql> insert into t1 values('2019-02-29');
Query OK,1 row affected, 1 warning (0.01sec)
mysql> select * fromt1;+---------------------+
| c1 |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)
å®é åå¨å¼ä¸æå ¥å¼ä¸ç¬¦ã
2.
mysql> create table t2(c1 varchar(10));
Query OK,0 rows affected (0.06sec)
mysql> insert into t2 values('a'),('b'),('c');
Query OK,3 rows affected (0.01sec)
Records:3 Duplicates: 0 Warnings: 0mysql> select * fromt2;+------+
| c1 |
+------+
| a |
| b |
| c |
+------+
3 rows in set (0.00sec)
mysql> alter table t2 modify column c1 int;
Query OK,3 rows affected, 3 warnings (0.05sec)
Records:3 Duplicates: 0 Warnings: 3mysql>show warnings;+---------+------+-------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: 'a' for column 'c1' at row 1 |
| Warning | 1366 | Incorrect integer value: 'b' for column 'c1' at row 2 |
| Warning | 1366 | Incorrect integer value: 'c' for column 'c1' at row 3 |
+---------+------+-------------------------------------------------------+
3 rows in set (0.00sec)
mysql> select * fromt2;+------+
| c1 |
+------+
| 0 |
| 0 |
| 0 |
+------+
3 rows in set (0.00 sec)
DDL导è´ååå 容丢失ã
3.
mysql> create table t3(id int not null,c1 varchar(10));
Query OK,0 rows affected (0.05sec)
mysql> insert into t3 values(null,'a');
ERROR1048 (23000): Column 'id' cannot be nullmysql> insert into t3(c1) values('a');
Query OK,1 row affected, 1 warning (0.00sec)
mysql>show warnings;+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1364 | Field 'id' doesn't have a default value |
+---------+------+-----------------------------------------+
1 row in set (0.00sec)
mysql> select * fromt3;+----+------+
| id | c1 |
+----+------+
| 0 | a |
+----+------+
1 row in set (0.00 sec)
æ¾å¼æå®åå䏿¾å¼æå®çå¤çé»è¾ç«ç¶ä¸ä¸æ ·ã
为ä»ä¹ä¼è¿æ ·å¢ï¼è¿ä¸ªå³ä¸SQL_MODEæå ³ã
å¨MySQL 5.6ä¸ï¼ SQL_MODEçé»è®¤å¼ä¸º"NO_ENGINE_SUBSTITUTION"ï¼éä¸¥æ ¼æ¨¡å¼ã
å¨è¿ç§æ¨¡å¼ä¸ï¼å¨è¿è¡æ°æ®åæ´æä½æ¶ï¼å¦ææ¶åçåä¸å卿 æå¼(妿¥æä¸åå¨ï¼æ°æ®ç±»åä¸å¯¹ï¼æ°æ®æº¢åº)ï¼åªä¼æç¤º"Warning"ï¼å¹¶ä¸ä¼æ¥éã
妿è¦è§é¿ä¸è¿°é®é¢ï¼éå¼å¯SQL_MODEçä¸¥æ ¼æ¨¡å¼ã
SQL_MODEçä¸¥æ ¼æ¨¡å¼
æè°çä¸¥æ ¼æ¨¡å¼ï¼å³SQL_MODEä¸å¼å¯äºSTRICT_ALL_TABLESæSTRICT_TRANS_TAB LESã
è¿æ¯ä¸é¢çDemoï¼ççä¸¥æ ¼æ¨¡å¼ä¸ï¼MySQLçå¤çé»è¾ã
mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK,0 rows affected (0.00sec)
mysql> insert into t1 values('2019-02-29');
ERROR1292 (22007): Incorrect datetime value: '2019-02-29' for column 'c1' at row 1mysql> alter table t2 modify column c1 int;
ERROR1366 (HY000): Incorrect integer value: 'a' for column 'c1' at row 1mysql> insert into t3(c1) values('a');
ERROR1364 (HY000): Field 'id' doesn't have a default value
åæ ·çSQLï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼ç´æ¥æç¤º"ERROR"ï¼è䏿¯"Warning"ã
åæ¯ä¸¥æ ¼æ¨¡å¼ï¼ä¸é¢ççSTRICT_ALL_TABLESæSTRICT_TRAN S_TABLESçåºå«ã
STRICT_ALL_TABLESä¸STRICT_TRANS_TABLESçåºå«
STRICT_TRANS_TABLESåªå¯¹äºå¡è¡¨å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼STRICT_ALL_TABLESæ¯å¯¹ææè¡¨å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¸ä» ä» æ¯äºå¡è¡¨ï¼è¿å æ¬éäºå¡è¡¨ã
çä¸é¢è¿ä¸ªæµè¯ã
对myisam表æå ¥3æ¡æ°æ®ï¼å ¶ä¸ï¼ç¬¬3æ¡æ°æ®æ¯ç©ºå符串ï¼ä¸å®ä¹çintç±»åä¸å¹é ã
mysql> create table t (c1 int) engine=myisam;
Query OK,0 rows affected (0.00sec)
mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values (1),(2),('');
Query OK,3 rows affected, 1 warning (0.00sec)
Records:3 Duplicates: 0 Warnings: 1mysql>show warnings;+---------+------+------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'c1' at row 3 |
+---------+------+------------------------------------------------------+
1 row in set (0.00sec)
mysql> select * fromt;+------+
| c1 |
+------+
| 1 |
| 2 |
| 0 |
+------+
3 rows in set (0.00sec)
mysql> set session sql_mode='STRICT_ALL_TABLES';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values (1),(2),('');
ERROR1366 (HY000): Incorrect integer value: '' for column 'c1' at row 3
å¯ä»¥çå°ï¼å¨è¡¨ä¸ºmyisamåå¨å¼æçæ åµä¸ï¼åªæå¼å¯STRICT_ALL_TABLESæä¼æ¥éã
ä¸åçæ¬é»è®¤çSQL_MODE
MySQL 5.5ï¼ç©º
MySQL 5.6ï¼NO_ENGINE_SUBSTITUTION
MySQL 5.7ï¼ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
MySQL 8.0ï¼ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,  NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION
å¦ä½ä¿®æ¹SQL_MODE
SQL_MODEæ¢å¯å¨å ¨å±çº§å«ä¿®æ¹ï¼åå¯å¨ä¼è¯çº§å«ä¿®æ¹ã坿å®å¤ä¸ªMODEï¼MODEä¹é´ç¨éå·éå¼ã
å ¨å±çº§å«
set global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES';
ä¼è¯çº§å«
set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES';
SQL_MODEç宿´å表
ALLOW_INVALID_DATES
å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼å¯¹äºæ¥æçæ£æµè¾ä¸ºä¸¥æ ¼ï¼å ¶å¿ é¡»ææãè¥å¼å¯è¯¥MODEï¼å¯¹äºmonthådayçæ£æµä¼ç¸å¯¹å®½æ¾ãå ¶ä¸ï¼monthåªéå¨1~12ä¹é´ï¼dayåªéå¨1~31ä¹é´ï¼èä¸ç®¡å ¶æ¯å¦ææï¼å¦ä¸é¢ç'2004-02-31'ã
mysql> create table t (c1 datetime);
Query OK,0 rows affected (0.21sec)
mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values('2004-02-31');
ERROR1292 (22007): Incorrect datetime value: '2004-02-31' for column 'c1' at row 1mysql> set session sql_mode='STRICT_TRANS_TABLES,ALLOW_INVALID_DATES';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values('2004-02-31');
Query OK,1 row affected (0.01sec)
mysql> select * fromt;+---------------------+
| c1 |
+---------------------+
| 2004-02-31 00:00:00 |
+---------------------+
1 row in set (0.00 sec)
注æï¼è¯¥MODEåªéç¨äºDATEåDATETIMEï¼ä¸éç¨äºTIMESTAMPã
ANSI_QUOTES
å¨MySQLä¸ï¼å¯¹äºå ³é®ååä¿çåï¼æ¯ä¸å 许ç¨å表åååæ®µåçã妿ä¸å®è¦ä½¿ç¨ï¼å¿ 须使ç¨åå¼å·("`")è¿è¡è½¬ä¹ã
mysql> create table order (id int);
ERROR1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order (id int)' at line 1mysql> create table `order` (id int);
Query OK,0 rows affected (0.12 sec)
è¥å¼å¯è¯¥MODEï¼ååå¼å·ï¼ååå¼å·ä¸æ ·ï¼å¯å¯¹å ³é®ååä¿çå转ä¹ã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> create table "order" (c1 int);
ERROR1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"order" (c1 int)' at line 1mysql> set session sql_mode='ANSI_QUOTES';
Query OK,0 rows affected (0.00sec)
mysql> create table "order" (c1 int);
Query OK,0 rows affected (0.17 sec)
éè¦æ³¨æçæ¯ï¼å¨å¼å¯è¯¥MODEçæ åµä¸ï¼ä¸è½åç¨åå¼å·æ¥å¼å符串ã
ERROR_FOR_DIVISION_BY_ZERO
该MODEå³å®é¤æ°ä¸º0çå¤çé»è¾ï¼å®é ææè¿åå³äºæ¯å¦å¼å¯ä¸¥æ ¼æ¨¡å¼ã
1. å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¸å¼å¯è¯¥MODEï¼æå ¥1/0ï¼ä¼ç´æ¥æ¥éã
mysql> create table t (c1 double);
Query OK,0 rows affected (0.04sec)
mysql> set session sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values(1/0);
ERROR1365 (22012): Division by 0
2. åªå¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¸å¼å¯è¯¥MODEï¼å 许1/0çæå ¥ï¼ä¸ä¸æç¤ºwarningï¼1/0æåä¼è½¬å为NULLã
mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values(1/0);
Query OK,1 row affected (0.07sec)
mysql> select * fromt;+------+
| c1 |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
3. ä¸å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼åªå¼å¯è¯¥MODEï¼å 许1/0çæå ¥ï¼ä½æç¤ºwarningã
4. ä¸å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¹ä¸å¼å¯è¯¥MODEï¼å 许1/0çæå ¥ï¼ä¸ä¸æç¤ºwarningï¼å2䏿 ·ã
HIGH_NOT_PRECEDENCE
é»è®¤æ åµä¸ï¼NOTçä¼å 级ä½äºæ¯è¾è¿ç®ç¬¦ãä½å¨æäºä½çæ¬ä¸ï¼NOTçä¼å 级é«äºæ¯è¾è¿ç®ç¬¦ã
çç两è çåºå«ã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> select not 1 < -1;+------------+
| not 1 < -1 |
+------------+
| 1 |
+------------+
1 row in set (0.00sec)
mysql> set session sql_mode='HIGH_NOT_PRECEDENCE';
Query OK,0 rows affected (0.00sec)
mysql> select not 1 < -1;+------------+
| not 1 < -1 |
+------------+
| 0 |
+------------+
1 row in set (0.00 sec)
å¨sql_modeä¸ºç©ºçæ åµä¸ï¼ not 1 < -1ç¸å½äºnot (1 < -1)ï¼å¦æè®¾ç½®äº'HIGH_ NOT_PRECEDENCE'ï¼åç¸å½äº(not 1) < -1ã
IGNORE_SPACE
é»è®¤æ åµä¸ï¼å½æ°ååå·¦æ¬å·(â(â)ä¹é´ä¸å 许åå¨ç©ºæ ¼ãè¥å¼å¯è¯¥MODEï¼åå 许ã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> select count(*) fromt;+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00sec)
mysql> select count (*) fromt;
ERROR1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) from t' at line 1mysql> set session sql_mode='IGNORE_SPACE';
Query OK,0 rows affected (0.01sec)
mysql> select count (*) fromt;+-----------+
| count (*) |
+-----------+
| 2 |
+-----------+
1 row in set (0.01 sec)
NO_AUTO_VALUE_ON_ZERO
é»è®¤æ åµä¸ï¼å¨å¯¹èªå¢ä¸»é®æå ¥NULLæ0æ¶ï¼ä¼èªå¨çæä¸ä¸ä¸ªå¼ãè¥å¼å¯è¯¥MODEï¼å½æå ¥0æ¶ï¼å¹¶ä¸ä¼èªå¨çæä¸ä¸ä¸ªå¼ã
å¦æè¡¨ä¸èªå¢ä¸»é®ååå¨0å¼ï¼å¨è¿è¡é»è¾å¤ä»½è¿åæ¶ï¼å¯è½ä¼å¯¼è´æ°æ®ä¸ä¸è´ãæä»¥mysqldumpå¨çæå¤ä»½æ°æ®ä¹åï¼ä¼èªå¨å¼å¯è¯¥MODEï¼ä»¥é¿å æ°æ®ä¸ä¸è´çæ åµã
mysql> create table t (id int auto_increment primary key);
Query OK,0 rows affected (0.11sec)
mysql> set session sql_mode='';
Query OK,0 rows affected (0.01sec)
mysql> insert into t values (0);
Query OK,1 row affected (0.04sec)
mysql> select * fromt;+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00sec)
mysql> set session sql_mode='NO_AUTO_VALUE_ON_ZERO';
Query OK,0 rows affected (0.02sec)
mysql> insert into t values (0);
Query OK,1 row affected (0.09sec)
mysql> select * fromt;+----+
| id |
+----+
| 0 |
| 1 |
+----+
2 rows in set (0.00 sec)
NO_BACKSLASH_ESCAPES
é»è®¤æ åµä¸ï¼åææ â\âä¼ä½ä¸ºè½¬ä¹ç¬¦ï¼è¥å¼å¯è¯¥MODEï¼ååææ â\âä¼ä½ä¸ºä¸ä¸ªæ®éå符ï¼è䏿¯è½¬ä¹ç¬¦ã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.01sec)
mysql> select '\\t';+----+
| \t |
+----+
| \t |
+----+
1 row in set (0.00sec)
mysql> set session sql_mode='NO_BACKSLASH_ESCAPES';
Query OK,0 rows affected (0.00sec)
mysql> select '\\t';+-----+
| \\t |
+-----+
| \\t |
+-----+
1 row in set (0.00 sec)
NO_DIR_IN_CREATE
é»è®¤æ åµä¸ï¼å¨å建表æ¶ï¼å¯ä»¥æå®æ°æ®ç®å½(DATA DIRECTORY)åç´¢å¼ç®å½(INDEX DIRECTORY)ï¼è¥å¼å¯è¯¥MODEï¼åä¼å¿½ç¥è¿ä¸¤ä¸ªé项ãå¨ä¸»ä»å¤å¶åºæ¯ä¸ï¼å¯å¨ä»åºä¸å¼å¯è¯¥MODEã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.01sec)
mysql> create table t (id int) data directory '/tmp/';
Query OK,0 rows affected (0.15sec)
mysql> show create tablet\G*************************** 1. row ***************************
Table: tCreate Table: CREATE TABLE`t` (
`id`int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci DATA DIRECTORY='/tmp/'
1 row in set (0.00sec)
mysql> set session sql_mode='NO_DIR_IN_CREATE';
Query OK,0 rows affected (0.00sec)
mysql> drop tablet;
Query OK,0 rows affected (0.11sec)
mysql> create table t (id int) data directory '/tmp/';
Query OK,0 rows affected, 1 warning (0.05sec)
mysql> show create tablet\G*************************** 1. row ***************************
Table: tCreate Table: CREATE TABLE`t` (
`id`int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)
NO_ENGINE_SUBSTITUTION
å¨å¼å¯è¯¥MODEçæ åµä¸ï¼å¨å建表æ¶ï¼å¦ææå®çåå¨å¼æä¸å卿䏿¯æï¼åä¼ç´æ¥æç¤ºâERRORâã
è¥ä¸å¼å¯ï¼ååªä¼æç¤ºâWarningâï¼ä¸ä½¿ç¨é»è®¤çåå¨å¼æã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> create table t (id int) engine=federated;
Query OK,0 rows affected, 2 warnings (0.11sec)
mysql>show warnings;+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1286 | Unknown storage engine 'federated' |
| Warning | 1266 | Using storage engine InnoDB for table 't' |
+---------+------+-------------------------------------------+
2 rows in set (0.00sec)
mysql> show create tablet\G*************************** 1. row ***************************
Table: tCreate Table: CREATE TABLE`t` (
`id`int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.01sec)
mysql> drop tablet;
Query OK,0 rows affected (0.11sec)
mysql> set session sql_mode='NO_ENGINE_SUBSTITUTION';
Query OK,0 rows affected (0.00sec)
mysql> create table t (id int) engine=federated;
ERROR1286 (42000): Unknown storage engine 'federated'
NO_UNSIGNED_SUBTRACTION
ä¸¤ä¸ªæ´æ°ç¸åï¼å¦æå ¶ä¸ä¸ä¸ªæ°æ¯æ 符å·ä½ï¼é»è®¤æ åµä¸ï¼ä¼äº§çä¸ä¸ªæ 符å·ä½çå¼ï¼å¦æè¯¥å¼ä¸ºè´æ°ï¼åä¼æç¤ºâERRORâãå¦ï¼
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> select cast(0 as unsigned)-1;
ERROR1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
è¥å¼å¯è¯¥MODEï¼åå è®¸ç»æä¸ºè´æ°ã
mysql> set session sql_mode='NO_UNSIGNED_SUBTRACTION';
Query OK,0 rows affected (0.00sec)
mysql> select cast(0 as unsigned)-1;+-----------------------+
| cast(0 as unsigned)-1 |
+-----------------------+
| -1 |
+-----------------------+
1 row in set (0.00 sec)
NO_ZERO_DATE
该MODEä¼å½±å'0000-00-00'çæå ¥ãå®é ææè¿åå³äºæ¯å¦å¼å¯ä¸¥æ ¼æ¨¡å¼ã
1. å¨å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¸åæ¶å¼å¯è¯¥MODEï¼æ¯ä¸å 许'0000-00-00'æå ¥çã
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_DATE';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql>show warnings\G*************************** 1. row ***************************
Level: Warning
Code:3135Message:'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode ina future release.1 row in set (0.00sec)
mysql> insert into t values ('0000-00-00');
ERROR1292 (22007): Incorrect datetime value: '0000-00-00' for column 'c1' at row 1
2. åªå¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¸å¼å¯è¯¥MODEï¼å 许'0000-00-00'å¼çæå ¥ï¼ä¸ä¸æç¤ºwarningã
mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values ('0000-00-00');
Query OK,1 row affected (0.04 sec)
3. ä¸å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼åªå¼å¯è¯¥MODEï¼å 许'0000-00-00'å¼çæå ¥ï¼ä½æç¤ºwarningã
mysql> set session sql_mode='NO_ZERO_DATE';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> insert into t values ('0000-00-00');
Query OK,1 row affected, 1 warning (0.05sec)
mysql>show warnings;+---------+------+---------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'c1' at row 1 |
+---------+------+---------------------------------------------+
1 row in set (0.01 sec)
4. ä¸å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼ä¹ä¸å¼å¯è¯¥MODEï¼å 许'0000-00-00'å¼çæå ¥ï¼ä¸ä¸æç¤ºwarningã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> insert into t values ('0000-00-00');
Query OK,1 row affected (0.03 sec)
NO_ZERO_IN_DATE
åNO_ZERO_DATE类似ï¼åªä¸è¿NO_ZERO_DATEéå¯¹çæ¯'0000-00-00'ï¼èNO_ZERO_IN_DATEéå¯¹çæ¯å¹´ä¸ä¸º0ï¼ä½ææè æ¥ä¸º0çæ¥æï¼å¦ï¼'2010-00-01' or '2010-01-00'ã
å®é ææä¹æ¯åå³äºæ¯å¦å¼å¯ä¸¥æ ¼æ¨¡å¼ï¼åNO_ZERO_DATE䏿 ·ã
ONLY_FULL_GROUP_BY
å¼å¯è¯¥MODEï¼åSELECTå表ä¸åªè½åºç°åç»ååèå彿°ã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> select dept_no,emp_no,min(from_date) from dept_emp group bydept_no;+---------+--------+----------------+
| dept_no | emp_no | min(from_date) |
+---------+--------+----------------+
| d001 | 10017 | 1985-01-01 |
| d002 | 10042 | 1985-01-01 |
| d003 | 10005 | 1985-01-01 |
| d004 | 10003 | 1985-01-01 |
| d005 | 10001 | 1985-01-01 |
| d006 | 10009 | 1985-01-01 |
| d007 | 10002 | 1985-01-01 |
| d008 | 10007 | 1985-01-01 |
| d009 | 10011 | 1985-01-01 |
+---------+--------+----------------+
9 rows in set (0.64sec)
mysql> set session sql_mode='ONLY_FULL_GROUP_BY';
Query OK,0 rows affected (0.00sec)
mysql> select dept_no,emp_no,min(from_date) from dept_emp group bydept_no;
ERROR1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'employees.dept_emp.emp_no' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
妿ä¸å¼å¯è¯¥MODEï¼åå 许SELECTå表ä¸åºç°ä»»æåï¼ä½è¿äºåçå¼å¹¶ä¸æ¯ç¡®å®çï¼å®æ¹ææ¡£ä¸ä¹æå°äºè¿ä¸ç¹ã
If ONLY_FULL_GROUP_BY is disabled, a MySQL extension to the standard SQL use of GROUP BY permits the select list, HAVING condition, or ORDER BY list to refer to nonaggregated columns even if the columns are not functionally dependent on GROUP BY columns. This causes MySQL toaccept the preceding query.In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic, which is probably notwhat you want.
Furthermore, the selectionof values from each group cannot be influenced by adding an ORDER BY clause. Result set sorting occurs after values have been chosen, and ORDER BY does not affect which value within each groupthe server chooses.
Disabling ONLY_FULL_GROUP_BYis useful primarily when you know that, due to some property of the data, all values in each nonaggregated column not named in the GROUP BY are the same for each group.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
PAD_CHAR_TO_FULL_LENGTH
å¨å¯¹CHARåæ®µè¿è¡å卿¶ï¼å¨Compactæ ¼å¼ä¸ï¼ä¼å ç¨åºå®é¿åº¦çåèã
å¦ä¸é¢çc1åï¼å®ä¹ä¸ºchar(10)ï¼è½ç¶'ab'åªå ç¨ä¸¤ä¸ªåèï¼ä½å¨Compactæ ¼å¼ä¸ï¼ä¼å ç¨10个åèï¼ä¸è¶³é¨åä»¥ç©ºæ ¼å¡«å ã
卿¥è¯¢æ¶ï¼é»è®¤æ åµä¸ï¼ä¼å餿æ«å°¾çç©ºæ ¼ãè¥å¼å¯è¯¥MODEï¼åä¸ä¼åé¤ï¼æ¯æ¬¡é½ä¼è¿ååºå®é¿åº¦çå符ã
mysql> create table t (c1 char(10));
Query OK,0 rows affected (0.17sec)
mysql> insert into t values('ab');
Query OK,1 row affected (0.11sec)
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> select c1, hex(c1), char_length(c1) fromt;+------+---------+-----------------+
| c1 | hex(c1) | char_length(c1) |
+------+---------+-----------------+
| ab | 6162 | 2 |
+------+---------+-----------------+
1 row in set (0.00sec)
mysql> set session sql_mode='PAD_CHAR_TO_FULL_LENGTH';
Query OK,0 rows affected (0.00sec)
mysql> select c1, hex(c1), char_length(c1) fromt;+------------+----------------------+-----------------+
| c1 | hex(c1) | char_length(c1) |
+------------+----------------------+-----------------+
| ab | 61622020202020202020 | 10 |
+------------+----------------------+-----------------+
1 row in set (0.00 sec)
PIPES_AS_CONCAT
å¨Oracleä¸ï¼è¿æ¥å符串å¯ç¨concatå管é符("||")ï¼ä½concatåªè½è¿æ¥ä¸¤ä¸ªå符串(MySQLä¸çconcatå¯è¿æ¥å¤ä¸ªå符)ï¼å±éæ§å¤ªå¤§ï¼å¦æè¦è¿æ¥å¤ä¸ªå符串ï¼ä¸è¬ç¨çæ¯ç®¡é符ã
å¼å¯è¯¥MODEï¼å³å¯å°ç®¡é符ä½ä¸ºè¿æ¥ç¬¦ã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> select 'a'||'b';+----------+
| 'a'||'b' |
+----------+
| 0 |
+----------+
1 row in set, 2 warnings (0.00sec)
mysql> select concat('a','b');+-----------------+
| concat('a','b') |
+-----------------+
| ab |
+-----------------+
1 row in set (0.00sec)
mysql> set session sql_mode='PIPES_AS_CONCAT';
Query OK,0 rows affected (0.00sec)
mysql> select 'a'||'b';+----------+
| 'a'||'b' |
+----------+
| ab |
+----------+
1 row in set (0.00 sec)
REAL_AS_FLOAT
å¨å建表æ¶ï¼æ°æ®ç±»å坿å®ä¸ºrealï¼é»è®¤æ åµä¸ï¼å ¶ä¼è½¬å为doubleï¼è¥å¼å¯è¯¥MODEï¼åä¼è½¬å为floatã
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> create table t ( c1 real);
Query OK,0 rows affected (0.12sec)
mysql> show create tablet\G*************************** 1. row ***************************
Table: tCreate Table: CREATE TABLE`t` (
`c1`double DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00sec)
mysql> drop tablet;
Query OK,0 rows affected (0.04sec)
mysql> set session sql_mode='REAL_AS_FLOAT';
Query OK,0 rows affected (0.00sec)
mysql> create table t ( c1 real);
Query OK,0 rows affected (0.11sec)
mysql> show create tablet\G*************************** 1. row ***************************
Table: tCreate Table: CREATE TABLE`t` (
`c1`float DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)
STRICT_ALL_TABLES
对äºå¡è¡¨å¼å¯ä¸¥æ ¼æ¨¡å¼ã
STRICT_TRANS_TABLES
对ææè¡¨å¼å¯ä¸¥æ ¼æ¨¡å¼ã
TIME_TRUNCATE_FRACTIONAL
卿¶é´ç±»åå®ä¹äºå°æ°ç§çæ åµä¸ï¼å¦ææå ¥ç使°å¤§äºæå®ç使°ï¼é»è®¤æ åµä¸ï¼ä¼åèäºå ¥ï¼è¥å¼å¯äºè¯¥MODEï¼åä¼ç´æ¥truncateæã
mysql> create table t (c1 int,c2 datetime(2));
Query OK,0 rows affected (0.04sec)
mysql> set session sql_mode='';
Query OK,0 rows affected (0.00sec)
mysql> insert into t values(1,'2018-08-08 11:12:13.125');
Query OK,1 row affected (0.06sec)
mysql> select * fromt;+------+------------------------+
| c1 | c2 |
+------+------------------------+
| 1 | 2018-08-08 11:12:13.13 |
+------+------------------------+
1 row in set (0.00sec)
mysql> set session sql_mode='TIME_TRUNCATE_FRACTIONAL';
Query OK,0 rows affected (0.00sec)
mysql> insert into t values(2,'2018-08-08 11:12:13.125');
Query OK,1 row affected (0.06sec)
mysql> select * fromt;+------+------------------------+
| c1 | c2 |
+------+------------------------+
| 1 | 2018-08-08 11:12:13.13 |
| 2 | 2018-08-08 11:12:13.12 |
+------+------------------------+
2 rows in set (0.00 sec)
NO_AUTO_CREATE_USER
å¨MySQL 8.0ä¹åï¼ç´æ¥ææä¼éå¼åå»ºç¨æ·ã
mysql> select host,user from mysql.user where user='u1';
Emptyset (0.00sec)
mysql> grant all on *.* to 'u1'@'%' identified by '123';
Query OK,0 rows affected, 1 warning (0.12sec)
mysql>show warnings;+---------+------+------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | Using GRANT for creating new user is deprecated and will be removed in future release. Create new user with CREATE USER statement. |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00sec)
mysql> select host,user from mysql.user where user='u1';+------+------+
| host | user |
+------+------+
| % | u1 |
+------+------+
1 row in set (0.00 sec)
åæ ·çgrantè¯å¥ï¼å¨MySQL 8.0䏿¯ä¼æ¥éçã
mysql> grant all on *.* to 'u1'@'%' identified by '123';
ERROR1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by'123'' at line 1
å¨MySQL 8.0ä¸ï¼å·²ä¸å 许grantè¯å¥éå¼åå»ºç¨æ·ï¼æä»¥ï¼è¯¥MODEå¨8.0ä¸ä¹ä¸åå¨ã
ä»åé¢ä¸çï¼è¯¥MODEæ¯ç¦æ¢æææ¶éå¼åå»ºç¨æ·ãä½å¨å®é æµè¯è¿ç¨ä¸ï¼åç°å ¶å¹¶ä¸è½ç¦æ¢ã
mysql> set session sql_mode='NO_AUTO_CREATE_USER';
Query OK,0 rows affected (0.03sec)
mysql> grant all on *.* to 'u1'@'%' identified by '123';
Query OK,0 rows affected, 1 warning (0.00 sec)
å ¶å®ï¼è¯¥MODEç¦æ¢çåªæ¯ä¸å¸¦âidentified byâåå¥çgrantè¯å¥ï¼å¯¹äºå¸¦æâidentified byâåå¥çgrantè¯å¥ï¼å ¶å¹¶ä¸ä¼ç¦æ¢ã
mysql> drop useru1;
Query OK,0 rows affected (0.00sec)
mysql> set session sql_mode='NO_AUTO_CREATE_USER';
Query OK,0 rows affected, 1 warning (0.00sec)
mysql> grant all on *.* to 'u1'@'%';
ERROR1133 (42000): Can't find any matching row in the user table
mysql> set session sql_mode='';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all on *.* to'u1'@'%';
Query OK, 0 rows affected, 1 warning (0.00 sec)
SQL_MODEç常è§ç»å
å¨MySQL 5.7ä¸ï¼è¿å¯å°SQL_MODE设置为ANSI, DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, TRADITIONALã
å ¶å®ï¼è¿äºMODEåªæ¯ä¸è¿°MODEçä¸ç§ç»åï¼ç®çæ¯ä¸ºäºåå ¶å®æ°æ®åºå ¼å®¹ã
å¨MySQL 8.0ä¸ï¼åªæ¯æANSIåTRADITIONALè¿ä¸¤ç§ç»åã
ANSI
çåäºREAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,  ONLY_FULL_GROUP_BYã
mysql> set session sql_mode='ANSI';
Query OK,0 rows affected (0.00sec)
mysql> show session variables like 'sql_mode';+---------------+--------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------------------------------------------------+
| sql_mode | REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI |
+---------------+--------------------------------------------------------------------------------+
1 row in set (0.03 sec)
TRADITIONAL
çåäºSTRICT_TRANS_TABLES,  STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTIONã
mysql> set session sql_mode='TRADITIONAL';
Query OK,0 rows affected (0.00sec)
mysql> show session variables like 'sql_mode';+---------------+----------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION |
+---------------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
æ»ç»
1. SQL_MODEå¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼ä¼åºç°å¾å¤ææä¸å°çç»æã建议线ä¸å¼å¯ä¸¥æ ¼æ¨¡å¼ãä½å¯¹äºçº¿ä¸èçç¯å¢ï¼å¦æä¸å¼å§å°±è¿è¡å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼åå¿ç´æ¥è°æ´ï¼æ¯ç«ä¸¤è ç差弿§è¿æ¯ç¸å½å·¨å¤§ã
2. 宿¹é»è®¤çSQL_MODEä¸ç´å¨åçååï¼MySQL 5.5, 5.6, 5.7å°±ä¸å°½ç¸åï¼ä½æ»ä½æ¯è¶ä¸¥çï¼å¨å¯¹æ°æ®åºè¿è¡å级æ¶ï¼å ¶å¿ é¡»èèé»è®¤çSQL_MODEæ¯å¦éè¦è°æ´ã
3. å¨è¿è¡æ°æ®åºè¿ç§»æ¶ï¼å¯éè¿è°æ´SQL_MODEæ¥å ¼å®¹å ¶å®æ°æ®åºçè¯æ³ã