溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么設(shè)置MySQL SQL模式

發(fā)布時(shí)間:2021-11-01 09:39:32 來源:億速云 閱讀:146 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要講解了“怎么設(shè)置MySQL SQL模式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么設(shè)置MySQL SQL模式”吧!

MySQL服務(wù)器可以以不同的SQL模式來進(jìn)行操作,并且依賴于sql_mode系統(tǒng)變量的值對(duì)不同的客戶端可以應(yīng)用這些不同的SQL模式。DBA可以設(shè)置全局SQL模式來匹配服務(wù)器操作要求,并且每種應(yīng)用程序可以設(shè)置它的會(huì)話SQL模式來滿足它的要求。

SQL模式會(huì)影響MySQL支持的SQL語(yǔ)法和數(shù)據(jù)驗(yàn)證檢查。這可以在不同環(huán)境中讓MySQL與其它數(shù)據(jù)庫(kù)一起使用變得更容易。

當(dāng)使用InnoDB表時(shí),可以考慮使用innodb_strict_mode系統(tǒng)變量,它可以對(duì)InnoDB表啟用額外的錯(cuò)誤檢查。

設(shè)置SQL模式
在MySQL 5.7中缺省的SQL模式包含: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。ONLY_FULL_GROUP_BY和STRICT_TRANS_TABLES是在MySQL 5.7.5中加入的。NO_AUTO_CREATE_USER是在MySQL 5.7.7中加入的。ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_IN_DATE和NO_ZERO_DATE是在MySQL 5.7.8中加入的。

為了在服務(wù)器啟動(dòng)時(shí)設(shè)置SQL模式,可以在命令行中使用--sql-mode="modes"選項(xiàng)或在選項(xiàng)文件比如Unix中的my.cnf或Windows上的my.ini文件中使用sql-mode="modes"選項(xiàng)。modes是用逗號(hào)分的不同模式列表。為了顯式的清除SQL模式,可以在命令行中使用--sql-mode=""選項(xiàng)將SQL模式設(shè)置為空字符串,或者在選項(xiàng)文件中使用sql-mode=""。

MySQL安裝程序可以在安裝過程中會(huì)配置SQL模式。例如,mysql_install_db將在基本的安裝目錄中創(chuàng)建一個(gè)命名為my.cnf的缺省選項(xiàng)文件。這個(gè)文件包含設(shè)置SQL模式的記錄。

如果SQL模式不同于缺省SQL模式或你所期待的SQL模式,可以檢查服務(wù)器在啟動(dòng)時(shí)所讀取的選項(xiàng)文件。

為了在運(yùn)行時(shí)改變SQL模式,可以使用set語(yǔ)句來設(shè)置全局或會(huì)話級(jí)的sql_mode系統(tǒng)變量:
set global sql_mode='modes';
set session sql_mode='modes';

設(shè)置global變量需要有super權(quán)限并且影響所有連接的客戶端操作。設(shè)置session變量只影響當(dāng)前客戶端。每個(gè)客戶端可以在任何時(shí)間改變它會(huì)話的sql_mode值來達(dá)到改變SQL模式的目的。

為了判斷當(dāng)前全局或session級(jí)的sql_mode值,執(zhí)行以下命令:

mysql> SELECT @@GLOBAL.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@SESSION.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@SESSION.sql_mode                                                                                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

注意在創(chuàng)建分區(qū)表并插入數(shù)據(jù)之后改變服務(wù)器的SQL模式會(huì)對(duì)表的行為造成重大改變并且可能導(dǎo)致丟失或損壞數(shù)據(jù)。所以強(qiáng)烈建議在創(chuàng)建用戶定義的分區(qū)表之后不要修改SQL模式。

當(dāng)復(fù)制分區(qū)表時(shí),在主從服務(wù)器之間不同的SQL模式也會(huì)導(dǎo)致一些問題。所以最好的結(jié)果就是在主從服務(wù)器上使用相同的SQL模式。

最重要的SQL模式
MySQL中最重要的sql_mode值可能是這些:
.ANSI
這種SQL模式改變語(yǔ)法和行為使其更接近標(biāo)準(zhǔn)SQL。它是一種特定的組合模式列表。

.STRICT_TRANS_TABLES
如果一個(gè)值不能以指定的方式插入到一個(gè)事務(wù)表,終止這個(gè)語(yǔ)句。對(duì)于非事務(wù)表,如果這個(gè)值在一個(gè)單行記錄語(yǔ)句或在多行記錄語(yǔ)句第一個(gè)出現(xiàn)時(shí)終止語(yǔ)句。從MySQL 5.7.5開始缺省的SQL模式包括STRICT_TRANS_TABLES。

.TRADITIONAL
使用MySQL行為像一個(gè)傳統(tǒng)的SQL數(shù)據(jù)庫(kù)系統(tǒng)。簡(jiǎn)單來說這種模式對(duì)于將一個(gè)不正確值插入到一個(gè)列中時(shí)拋出一個(gè)錯(cuò)誤來代替一個(gè)警告。它是特定組合模式中的一種。insert或update一旦發(fā)現(xiàn)錯(cuò)誤會(huì)立即終止。如果您正在使用非事務(wù)性存儲(chǔ)引擎,這可能不是您想要的,因?yàn)樵阱e(cuò)誤之前所做的數(shù)據(jù)更改可能無法回滾,從而導(dǎo)致“部分完成”的更新。

當(dāng)提到"strict mode"嚴(yán)格模式時(shí),它意味著是STRICT_TRANS_TABLES或STRICT_ALL_TABLES中的一種或兩種都被啟用。

完整的SQL模式列表
下面是所有支持的SQL模式列表:
.ALLOW_INVALID_DATES
不對(duì)日期執(zhí)行完全檢查。只對(duì)月份的范圍從1到12和日期的范圍從1到31執(zhí)行檢查。這對(duì)于Web應(yīng)用程序非常方便,您可以在三個(gè)不同的字段中獲得年、月和日,并且希望準(zhǔn)確地存儲(chǔ)用戶插入的內(nèi)容(不執(zhí)行日期校驗(yàn))。這種SQL模式應(yīng)用于date和datetime列。它不應(yīng)用于timestamp列,因?yàn)樗偸钦?qǐng)求一個(gè)合法的日期值。

這種SQL模式要求月分與每天的取值是合法值,并且范圍分別不能超過1到12和1到31。當(dāng)嚴(yán)格模式被禁用時(shí),一個(gè)無效的日期值比如'2014-04-31'將被轉(zhuǎn)換成'0000-00-00'并且生成一個(gè)警告。當(dāng)使用嚴(yán)格模式時(shí),一個(gè)無效的日期值會(huì)生成一個(gè)錯(cuò)誤。為了允許這樣的日期值,啟用ALLOW_INVALID_DATES模式。

.ANSI_QUOTES
將"作為標(biāo)識(shí)引用字符(像`引用字符)而不是字符串引用字符。當(dāng)使用這種SQL模式時(shí)仍然可以使用`作為引用標(biāo)識(shí)符,當(dāng)ANSI_QUOTES被使用時(shí),不能使用雙引號(hào)來引用文本字符串,因?yàn)樗唤馕鲎鳂?biāo)識(shí)符了。

.ERROR_FOR_DIVISION_BY_ZERO
ERROR_FOR_DIVISION_BY_ZERO模式影響對(duì)除以零的處理,這包含MOD(N,0)。對(duì)于數(shù)據(jù)修改操作(insert,update),它的影響也依賴于是否啟用了嚴(yán)格SQL模式。
-如果這種模式?jīng)]有被啟用,除以零會(huì)插入NULL值并且沒有警告。
-如果這種模式被啟用,除以零會(huì)插入NULL值并生成警告。
-如果這種模式與嚴(yán)格SQL模式被啟用,除以堆生成一個(gè)錯(cuò)誤,除非IGNORE也被指定。對(duì)于insert ignore和update ignore,除以零會(huì)插入NULL值并生成警告。

對(duì)于select語(yǔ)句,除以零會(huì)返回NULL值。啟用ERROR_FOR_DIVISION_BY_ZERO不管是否啟用嚴(yán)格SQL模式會(huì)導(dǎo)致生成一個(gè)警告。

在MySQL 5.7.4中,ERROR_FOR_DIVISION_BY_ZERO被丟棄,在MySQL 5.7.4到5.7.7中當(dāng)顯式命名時(shí)ERROR_FOR_DIVISION_BY_ZERO不會(huì)做任何事。代替的是,它的影響被包含在嚴(yán)格SQL模式中。在MySQL 5.7.8和以后的版本中,當(dāng)顯式命名時(shí)ERROR_FOR_DIVISION_BY_ZERO會(huì)有影響并且沒有包含在嚴(yán)格SQL模式中,就像MySQL5.7.4之前的版本一樣。然而缺省情況下當(dāng)嚴(yán)格模式啟用下應(yīng)該與它聯(lián)合使用。如果ERROR_FOR_DIVISION_BY_ZERO被啟用而沒有啟用嚴(yán)格模式或者當(dāng)啟用嚴(yán)格模式而沒有啟用ERROR_FOR_DIVISION_BY_ZERO時(shí)會(huì)出現(xiàn)這個(gè)警告。

因?yàn)镋RROR_FOR_DIVISION_BY_ZERO被丟棄,它將在將來的版本中被刪除并作為一個(gè)單獨(dú)的模式名并且它的影響被包含在嚴(yán)格SQL模式。

.HIGH_NOT_PRECEDENCE
NOT操作的優(yōu)先級(jí)就像NOT a between b and c會(huì)被解析成NOT (a between b and c)一樣。在一些舊版本的MySQL中,表達(dá)式會(huì)被解析成(NOT a) between b and c。舊版本更高優(yōu)先級(jí)行為可以通過啟用HIGH_NOT_PRECEDENCE模式來獲得。

mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
+------------------------+
| NOT 1 BETWEEN -5 AND 5 |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)
mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
+------------------------+
| NOT 1 BETWEEN -5 AND 5 |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

.IGNORE_SPACE
允許在函數(shù)名與(符號(hào)之間存在空格。這會(huì)造成內(nèi)置函數(shù)名被作為保留關(guān)鍵字對(duì)待。因此標(biāo)識(shí)符與函數(shù)名相同必須有引號(hào)。例如,因?yàn)橛幸粋€(gè)count()函數(shù),因此在下面的語(yǔ)句中使用count作為表名就會(huì)出錯(cuò):

mysql> CREATE TABLE count (i INT);
Query OK, 0 rows affected (0.13 sec)
mysql> drop table count cascade;
Query OK, 0 rows affected (0.09 sec)
mysql> SET sql_mode = 'IGNORE_SPACE';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE count (i INT);
ERROR 1064 (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 'count (i INT)' at line 1
mysql> create table `count` (i INT);
Query OK, 0 rows affected (0.16 sec)

IGNORE_SPACE模式應(yīng)用到內(nèi)置函數(shù),而不是用戶定義的函數(shù)或存儲(chǔ)過程。它總是允許在用戶定義的函數(shù)或存儲(chǔ)過程名后有空格而不管是否啟用了IGNORE_SAPCE模式。

.NO_AUTO_CREATE_USER
除非指定了身份驗(yàn)證信息,否則將阻止GRANT語(yǔ)句自動(dòng)創(chuàng)建新用戶帳戶。這個(gè)語(yǔ)句必須使用identified by來指定非空密碼或使用identified with來使用一種驗(yàn)證插件。

最好使用create user來創(chuàng)建MySQL賬號(hào),然后使用Grant語(yǔ)句。NO_AUTO_CREATE_USER已經(jīng)被丟棄并且缺省的SQL模式包含了NO_AUTO_CREATE_USER模式。將sql_mode修改為NO_AUTO_CREATE_USER模式會(huì)生成一個(gè)警告,除了指定sql_mode為DEFAULT.NO_AUTO_CREATE_USER將會(huì)在將來的版本中被刪除,到時(shí)它的影響將會(huì)一直被啟用。

之前,在NO_AUTO_CREATE_USER被丟棄之前,一個(gè)不啟用它的原因是它是不安全的復(fù)制。現(xiàn)在它可以被啟用并且使用create user if not exists,drop user if exists和alter user if exists而不是grant語(yǔ)句來執(zhí)行安全復(fù)制管理。這些語(yǔ)句當(dāng)從服務(wù)器相對(duì)于主服務(wù)器有不同的授權(quán)時(shí)可以啟用安全復(fù)制。

.NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO影響對(duì)AUTO_INCREMENT列的處理。正常來說通過向訪列插入NULL或0來為列生成下一個(gè)序列值。NO_AUTO_VALUE_ON_ZERO會(huì)抑制0的行為因此只有插入NULL時(shí)會(huì)生成下一個(gè)序列值。如果0已經(jīng)被存儲(chǔ)到表的AUTO_INCREMENT列中這個(gè)SQL模式可能是有用的。(存儲(chǔ)0是不建議的)例如,如果使用mysqldump來dump表并且然后再加載它,當(dāng)遇到值0時(shí)MySQL正常來說會(huì)生成一個(gè)新的序列值,因此表的內(nèi)容不同于被dump的內(nèi)容。在加載dump文件之前啟用NO_AUTO_VALUE_ON_ZERO來解決這個(gè)問題。mysqldump現(xiàn)在在它的輸出中自動(dòng)包含一個(gè)語(yǔ)句來啟用NO_AUTO_VALUE_ON_ZERO來避免這個(gè)問題。

.NO_BACKSLASH_ESCAPES
禁用在字符串中使用反斜杠字符(\)作為轉(zhuǎn)義字符。啟用此模式后,反斜杠將成為與其他字符一樣的普通字符。

.NO_DIR_IN_CREATE
創(chuàng)建表時(shí),忽略所有索引目錄和數(shù)據(jù)目錄指令。此選項(xiàng)在從復(fù)制服務(wù)器上非常有用。

.NO_ENGINE_SUBSTITUTION
當(dāng)一個(gè)語(yǔ)句比如create table或alter table指定一個(gè)存儲(chǔ)引擎已經(jīng)被禁用或沒有被編譯時(shí)控制缺省存儲(chǔ)引擎的自動(dòng)替換。缺省的SQL模式中包含了NO_ENGINE_SUBSTITUTION。因?yàn)榇鎯?chǔ)引擎可以在運(yùn)行時(shí)被附加進(jìn)來,不可以存儲(chǔ)引擎也以相同方式被對(duì)待:
當(dāng)NO_ENGINE_SUBSTITUTION被禁用,對(duì)于create table的缺省存儲(chǔ)引擎被使用并且如果期待的存儲(chǔ)引擎不可用會(huì)出現(xiàn)一個(gè)警告。對(duì)于alter table,會(huì)出現(xiàn)一個(gè)警告并且表不能被修改。
當(dāng)NO_ENGINE_SUBSTITUTION被啟用時(shí),如果期待的存儲(chǔ)引擎不可用會(huì)出現(xiàn)一個(gè)警告并且表不會(huì)被創(chuàng)建或被修改。

.NO_FIELD_OPTIONS
在show create table輸出中不打印特定MySQL列選項(xiàng)。這種SQL模式被mysqldump以可移植模式來使用。

.NO_KEY_OPTIONS
在show create table輸出中不打印特定MySQL索引選項(xiàng)。這種SQL模式被mysqldump以可移植模式來使用。

.NO_TABLE_OPTIONS
在show create table輸出中不打印特定MySQL表選項(xiàng)(比如ENGINE)。這種SQL模式被mysqldump以可移植模式來使用。

.NO_UNSIGNED_SUBTRACTION
兩個(gè)整數(shù)相減,這里一種類型UNSIGNED,缺省情況下生成一個(gè)沒有符號(hào)的結(jié)果。如果結(jié)果出現(xiàn)負(fù)數(shù)將會(huì)出現(xiàn)錯(cuò)誤:

mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

如果NO_UNSIGNED_SUBTRACTION模式被啟用,結(jié)果將是負(fù)數(shù):

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
1 row in set (0.00 sec)

如果使用此類操作的結(jié)果更新無符號(hào)整數(shù)列,則將該結(jié)果裁剪為該列類型的最大值,如果啟用no_unsigned_subtract,則將其裁剪為0。如果嚴(yán)格SQL模式被啟用,則會(huì)出現(xiàn)錯(cuò)誤并且列會(huì)保持不變。

當(dāng)no_unsigned_subtraction被啟用時(shí),就算任何操作數(shù)據(jù)是無符號(hào)的相減的結(jié)果是有符號(hào)的。例如比較表t1中的c2列與表t2中的c2列:

mysql> SET sql_mode='';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
Query OK, 0 rows affected (0.20 sec)
mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc t1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| c2    | bigint(21) unsigned | NO   |     | 0       |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc t2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c2    | bigint(21) | NO   |     | 0       |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

這意味著bigint unsigned在所有上下文中不是100%可以使用。

.NO_ZERO_DATE
NO_ZERO_DATE模式影響服務(wù)器是否允許'0000-00-00'作為一種有效的日期。它的影響也依賴于是否啟用了嚴(yán)格SQL模式。
-如果模式?jīng)]有被啟用,'0000-00-00'被允許并且插入不會(huì)產(chǎn)生警告。
-如果模式被啟用,'0000-00-00'被允許并且插入會(huì)產(chǎn)生警告。
-如果模式和嚴(yán)格SQL模式被啟用,'0000-00-00'不被允許并且插入會(huì)出現(xiàn)錯(cuò)誤,除非指定IGNORE選項(xiàng)。對(duì)于insert ignore和update ignore來說,'0000-00-00'被允許并且插入會(huì)產(chǎn)生警告。

在MySQL 5.7.4中,NO_ZERO_DATE被丟棄。在MySQL 5.7.4到5.7.7中,NO_ZERO_DATE當(dāng)顯式指定時(shí)不會(huì)工作。代替地是它的影響已經(jīng)被包含在嚴(yán)格SQL模式中。在MySQL 5.7.8和以后的版本中,當(dāng)顯式地指定NO_ZERO_DATE模式時(shí)它會(huì)工作并且它不是嚴(yán)格SQL模式的一部分就像MySQL5.7.4版本之前作用一樣。然而,缺省情況下它應(yīng)該與嚴(yán)格SQL模式聯(lián)合使用。如果啟用NO_ZERO_DATE而沒有啟用嚴(yán)格SQL模式就是出現(xiàn)警告或者反之亦然。

因?yàn)镹O_ZERO_DATE已經(jīng)被丟棄,因此它會(huì)在將來的版本中作為單獨(dú)的模式名被刪除并且它的影響會(huì)包含在嚴(yán)格SQL模式中。

.NO_ZERO_IN_DATE
NO_ZERO_IN_DATE模式影響服務(wù)器是否允許日期中的年部分為非0但月或日部分為0。(這種模式影響日期比如'2010-00-01'或'2010-01-00',而不是'0000-00-00'。為了控制服務(wù)器是否允許'0000-00-00',使用NO_ZERO_DATE模式)。NO_ZERO_IN_DATE模式的影響也依賴于是否啟用了嚴(yán)格SQL模式。
-如果這種模式?jīng)]有啟用,有為0部分折日期被允許并且插入不產(chǎn)生警告。
-如果這種模式被啟用,有為0部分的日期值將以'0000-00-00'格式被插入并且生成一個(gè)警告。
-如果這種模式與嚴(yán)格SQL模式被啟用,有為0部分的日期不被允許并且插入會(huì)產(chǎn)生一個(gè)錯(cuò)誤,除非你指定ignore。對(duì)于insert ignore和update ignore來說,有為0部分的日期將以'0000-00-00'格式被插入并且生成一個(gè)警告。

在MySQL 5.7.4中,NO_ZERO_IN_DATE被丟棄。在MySQL 5.7.4到5.7.7中,NO_ZERO_DATE當(dāng)顯式指定時(shí)不會(huì)工作。代替地是它的影響已經(jīng)被包含在嚴(yán)格SQL模式中。在MySQL 5.7.8和以后的版本中,當(dāng)顯式地指定NO_ZERO_IN_DATE模式時(shí)它會(huì)工作并且它不是嚴(yán)格SQL模式的一部分就像MySQL5.7.4版本之前作用一樣。然而,缺省情況下它應(yīng)該與嚴(yán)格SQL模式聯(lián)合使用。如果啟用NO_ZERO_IN_DATE而沒有啟用嚴(yán)格SQL模式就是出現(xiàn)警告或者反之亦然。

因?yàn)镹O_ZERO_IN_DATE已經(jīng)被丟棄,因此它會(huì)在將來的版本中作為單獨(dú)的模式名被刪除并且它的影響會(huì)包含在嚴(yán)格SQL模式中。

.ONLY_FULL_GROUP_BY
拒絕那些select list、HAVING condition或ORDER BY list引用非聚合列的查詢,這些列既不在GROUP BY子句中命名,也不依賴于GROUP BY列(由GROUP BY列唯一確定)。

從MySQL 5.7.5開始,缺省的SQL模式包含ONLY_FULL_GROUP_BY模式。(在5.7.5之前,MySQL沒有檢測(cè)到功能依賴并且缺省情況下ONLY_FULL_GROUP_BY模式?jīng)]有啟用。

MySQL擴(kuò)展了標(biāo)準(zhǔn)SQL來允許在having子句中引用select列表中的別名表達(dá)式。在MySQL 5.7.5之前,啟用ONLY_FULL_GROUP_BY模式會(huì)禁用這種擴(kuò)展,因此要求having子句以非別名表達(dá)式來書寫。從MySQL5.7.5開始,這種限制被取消了因此having子句可以引用別名而不用管ONLY_FULL_GROUP_BY模式是否啟用了。

.PAD_CAHR_TO_FULL_LENGTH
默認(rèn)情況下,在檢索時(shí)從CHAR列值中裁剪尾隨空格。如果PAD_CHAR_TO_FULL_LENGTH被啟用,裁剪不會(huì)發(fā)生并且在檢索CHAR列值時(shí)填充到它的完整長(zhǎng)度。這種模式不應(yīng)用于varchar列。檢索時(shí)為其保留尾隨空格。

mysql> CREATE TABLE t1 (c1 CHAR(10));
Query OK, 0 rows affected (0.12 sec)
mysql> INSERT INTO t1 (c1) VALUES('xy');
Query OK, 1 row affected (0.03 sec)
mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------+-----------------+
| c1   | CHAR_LENGTH(c1) |
+------+-----------------+
| xy   |               2 |
+------+-----------------+
1 row in set (0.00 sec)
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------------+-----------------+
| c1         | CHAR_LENGTH(c1) |
+------------+-----------------+
| xy         |              10 |
+------------+-----------------+
1 row in set (0.00 sec)

.PIPES_AS_CONCAT
將||作為字符串連接操作符(與concat()一樣)而不是作為OR的同義詞。

.REAL_AS_FLOAT
將REAL作為FLOAT的同義詞。缺省情況下,MySQL將REAL作為DOUBLE的同義詞。

.STRICT_ALL_TABLES
對(duì)所有的存儲(chǔ)引擎啟用嚴(yán)格SQL模式。無效的數(shù)據(jù)會(huì)被拒絕。從MySQL 5.7.4到5.7.7,STRICT_ALL_TABLES模式包含了ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE模式的影響。

.STRICT_TRANS_TABLES
對(duì)事務(wù)型存儲(chǔ)引擎啟用嚴(yán)格SQL模式并且在可能的情況下使用非事務(wù)型存儲(chǔ)引擎。從MySQL 5.7.4到5.7.7,STRICT_TRANS_TABLES模式包含了ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE模式的影響。

感謝各位的閱讀,以上就是“怎么設(shè)置MySQL SQL模式”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么設(shè)置MySQL SQL模式這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI