日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL_MODE设置

發布時間:2025/3/20 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL_MODE设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1.???SQL_MODE設置

???????? 在生產環境中強烈建議將這個值設置為嚴格模式,這樣有些問題可以在數據庫的設計和開發階段就能實現,而如果在生產環境下運行數據庫后發現這類問題,那么修改的代價將變得十分巨大。此外正確地設置sql_mode還可以做一些約束(constraint)檢查的工作。

???????? 對于sql_mode的設置,可以在配置文件、客戶端、當前會話或者全局會話中設置。查看sql_mode的設置情況:

mysql>select @@global.sql_mode;

+--------------------------------------------+

|@@global.sql_mode?????????????????????????|

+--------------------------------------------+

|STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |

+--------------------------------------------+

1 row inset (0.00 sec)

?

mysql>select @@session.sql_mode;

+--------------------------------------------+

|@@session.sql_mode????????????????????????|

+--------------------------------------------+

|STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |

+--------------------------------------------+

1 row inset (0.00 sec)

1.1.1.?????STRICT_TRANS_TABLES

???????? 嚴格模式是指將sql_mode變量設置為STRICT_TRANS_TABLESSTRICT_ALL_TABLES中的至少一種

???????? STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表,則中斷當前的操作不影響非事務表(例如表的存儲引擎為myisam);

1.1.2.?????ALLOWS_INVALID_DATES

???????? 該選項并不完全對日期的合法性進行檢查,只檢查月份是否在1-12之間,日期是否在1-31之間。該模式僅對datedatetime類型有效,而對timestamp無效,因為timestamp總是要求一個合法的輸入。

1.1.3.?????ANSI_QUOTES

???????? 啟用ANSI_QUOTES后,不能使用雙引號來引用字符串,因為它將被解釋為識別符。

mysql>create table z(a varchar(10))engine=innodb;

Query OK,0 rows affected (0.02 sec)

?

mysql>insert into z select "aaa";

Query OK,1 row affected (0.01 sec)

Records:1? Duplicates: 0? Warnings: 0

?

mysql>set sql_mode='ANSI_QUOTES';

Query OK,0 rows affected (0.00 sec)

?

mysql>insert into z select "aaa";

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

mysql>

1.1.4.?????ERROR_FOR_DIVISION_BY_ZERO

???????? insert或者update過程中,如果數據被零除(或MOD(X,0))則產生錯誤(否則為警告)。如果未給出該模式,那么數據被零除時,mysql返回NULL。如果用到INSERT IGNORE或者UPDATE IGNORE中,mysql生成被零除警告,但操作結果為NULL

1.1.5.?????HIGH_NOT_PRECEDENCE

???????? 啟用HIGH_NOT_PRECEDENCE:操作符的優先順序表達式。例如not a between b and c被解釋為NOT (a between a and b)。啟用HIGH_NOT_PRECEDENCE SQL模式,可以獲得以前版本的更高優先級的結果。

mysql>select 0 between -1 and 1;

+--------------------+

| 0between -1 and 1 |

+--------------------+

|????????????????? 1 |

+--------------------+

1 row inset (0.00 sec)

?

mysql>select not 0 between -1 and 1;

+------------------------+

| not 0between -1 and 1 |

+------------------------+

|????????????????????? 0 |

+------------------------+

1 row inset (0.00 sec)

mysql>set sql_mode='high_not_precedence';

Query OK,0 rows affected (0.00 sec)

?

mysql>select 0 between -1 and 1;

+--------------------+

| 0between -1 and 1 |

+--------------------+

|????????????????? 1 |

+--------------------+

1 row inset (0.01 sec)

????????

mysql>select not 0 between -1 and 1;

+------------------------+

| not 0between -1 and 1 |

+------------------------+

| ?????????????????????1 |

+------------------------+

1 row inset (0.00 sec)

???????? 被解釋為(not 0 between -1 and 1結果完全相反。

1.1.6.?????ignore_space

???????? 忽略函數名和括號之間的空格:

mysql>select max(a) from t;

+--------+

| max(a)|

+--------+

|??? 105 |

+--------+

1 row inset (0.00 sec)

mysql>select max (a) fromt;

ERROR1630 (42000): FUNCTION test.max does not exist. Check the 'Function NameParsing and Resolution' section in the Reference Manual

mysql>set sql_mode='ignore_space';

Query OK,0 rows affected (0.00 sec)

?

mysql>select max (a) from t;

+---------+

| max (a)|

+---------+

|???? 105 |

+---------+

1 row inset (0.00 sec)

?

1.1.7.?????NO_AUTO_CREATE_USER

???????? 禁止grant創建密碼為空的用戶

mysql>select @@sql_mode;

+---------------------+

|@@sql_mode????????? |

+---------------------+

|NO_AUTO_CREATE_USER |

+---------------------+

1 row inset (0.00 sec)

?

mysql>set sql_mode='';

Query OK,0 rows affected (0.00 sec)

?

mysql>grant all privileges on *.* to gf@'%';

Query OK,0 rows affected (0.00 sec)

?

mysql>set sql_mode='NO_AUTO_CREATE_USER';

Query OK,0 rows affected (0.00 sec)

?

mysql>grant all privileges on *.* to gf1@'%';

ERROR1133 (42000): Can't find any matching row in the user table

mysql>grant all privileges on *.* to gf1@'%' identified by 123456;

ERROR1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near'123456' at line 1

mysql>grant all privileges on *.* to gf5@'%' identified by 123456;

ERROR1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near'123456' at line 1

?

1.1.8.?????NO_AUTO_VALUE_ON_ZERO

???????? 該選項影響列為自增長的插入。在默認設置下,插入0或者null代表生成下一個自增長值。如果用戶希望插入的值為0,而該列又是自增長的,那么這個選項就有用了。

mysql>create table tt(id int primary key auto_increment);

Query OK,0 rows affected (0.02 sec)

?

mysql>explain tt\G;

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

? Field: id

?? Type: int(11)

?? Null: NO

??? Key: PRI

Default:NULL

? Extra: auto_increment

1 row inset (0.00 sec)

?

ERROR:

No queryspecified

?

mysql>insert into tt values(0);

Query OK,1 row affected (0.02 sec)

?

mysql>insert into tt values(null);

Query OK,1 row affected (0.00 sec)

?

mysql>insert into tt values(5);

Query OK,1 row affected (0.00 sec)

?

mysql>select * from tt;

+----+

| id |

+----+

|? 2 |

|? 4 |

|? 5 |

+----+

3 rows inset (0.00 sec)

?

mysql>set sql_mode='no_auto_value_on_zero';

Query OK,0 rows affected (0.00 sec)

?

mysql>truncate table tt;

Query OK,0 rows affected (0.01 sec)

?

mysql>insert into tt values(0);

Query OK,1 row affected (0.01 sec)

?

mysql>insert into tt values(null);

Query OK,1 row affected (0.00 sec)

?

mysql>insert into tt values(5);

Query OK,1 row affected (0.01 sec)

?

mysql>select * from tt;

+----+

| id |

+----+

|? 0 |

|? 2 |

|? 5 |

+----+

3 rows inset (0.01 sec)

???????? 只是對0插入有效。

1.1.9.?????NO_BACKSLASH_ESCAPES

???????? 反斜杠“\”作為普通字符而非轉義字符:

mysql>set sql_mode='NO_BACKSLASH_ESCAPES';

Query OK,0 rows affected (0.00 sec)

?

mysql>select '\\'\G;

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

\\: \\

1 row inset (0.00 sec)

?

ERROR:

No queryspecified

?

mysql>set sql_mode='';

Query OK,0 rows affected (0.00 sec)

?

mysql>select '\\'\G;

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

\: \

1 row inset (0.00 sec)

1.1.10.?NO_DIR_IN_CREATE

???????? 在創建表時忽視所有INDEXDIRETORYDATA DIRECTORY的選項。

1.1.11.?NO_ENGINE_SUBSTITUTION

???????? 如果需要的存儲引擎被禁用或者未編譯,那么拋出錯誤。

1.1.12.?NO_UNSIGNED_SUBSTITUTION

???????? 啟用這個選項后,兩個UNSIGNED類型相減返回SIGNED類型。

1.1.13.?NO_ZERO_DATE

???????? 在非嚴格模式下,可以插入形如“00-00-0000:00:00”的非法日期,mysql僅拋出一個警告,而啟用該選項后,mysql不允許插入零日期,插入0日期會拋出錯誤而非警告。

mysql>set sql_mode='no_zero_date,strict_trans_tables';

Query OK,0 rows affected, 1 warning (0.00 sec)

?

mysql>insert into tt values(null,'00-00-00 00:00:00');

ERROR1292 (22007): Incorrect datetime value: '00-00-00 00:00:00' for column 'date'at row 1

mysql>insert into tt values(null,'2014-12-02 00:00:00');

Query OK,1 row affected (0.01 sec)

?

mysql>select * from tt;

+----+---------------------+

| id |date??????????????? |

+----+---------------------+

|? 0 | NULL??????????????? |

|? 2 | NULL??????????????? |

|? 5 | NULL??????????????? |

|? 6 | NULL??????????????? |

|? 8 | 0000-00-00 00:00:00 |

| 10 |0000-00-00 00:00:00 |

| 12 |0000-00-00 00:00:00 |

| 14 |2014-12-02 00:00:00 |

+----+---------------------+

8 rows inset (0.00 sec)

???????? 注意一定是在strict_trans_tables,否則只是警告:

mysql>set sql_mode='no_zero_date';

Query OK,0 rows affected, 1 warning (0.00 sec)

?

mysql>insert into tt values(null,'00-00-00 00:00:00');

Query OK,1 row affected, 1 warning (0.00 sec)

mysql>show warnings;

+---------+------+-----------------------------------------------+

| Level?? | Code | Message?????????????????????????????????????? |

+---------+------+-----------------------------------------------+

| Warning| 1264 | Out of range value for column 'date' at row 1 |

+---------+------+-----------------------------------------------+

1 row inset (0.00 sec)

?

mysql>select * from tt;

+----+---------------------+

| id |date??????????????? |

+----+---------------------+

|? 0 | NULL??????????????? |

|? 2 | NULL??????????????? |

|? 5 | NULL??????????????? |

|? 6 | NULL?????????? ?????|

|? 8 | 0000-00-00 00:00:00 |

| 10 |0000-00-00 00:00:00 |

+----+---------------------+

6 rows inset (0.00 sec)

1.1.14.?NO_ZERO_IN_DATE

???????? 在嚴格模式下,不允許日期和月份為零:采用日期和月份為零的格式時mysql會直接拋出錯誤而非警告:

mysql>set sql_mode='NO_ZERO_IN_DATE';

Query OK,0 rows affected, 1 warning (0.00 sec)

?

mysql>TRUNCATE TABLE tt;

Query OK,0 rows affected (0.00 sec)

?

mysql>insert into tt values(null,'2014-12-02 00:00:00');

Query OK,1 row affected (0.00 sec)

?

mysql>insert into tt values(null,'2014-12-00 00:00:00');

Query OK,1 row affected, 1 warning (0.00 sec)

?

mysql>show warnings;

+---------+------+-----------------------------------------------+

|Level?? | Code | Message?????????????????????????????????????? |

+---------+------+-----------------------------------------------+

| Warning| 1264 | Out of range value for column 'date' at row 1 |

+---------+------+-----------------------------------------------+

1 row in set(0.00 sec)

?

mysql>select * from tt;

+----+---------------------+

| id |date??????????????? |

+----+---------------------+

|? 1 | 2014-12-02 00:00:00 |

|? 2 | 0000-00-00 00:00:00 |

+----+---------------------+

2 rows inset (0.00 sec)

?

mysql>set sql_mode='NO_ZERO_IN_DATE,strict_trans_tables';

Query OK,0 rows affected, 1 warning (0.00 sec)

?

mysql>insert into tt values(null,'2014-12-00 00:00:00');

ERROR1292 (22007): Incorrect datetime value: '2014-12-00 00:00:00' for column 'date'at row 1

mysql>

1.1.15.?ONLY_FULL_GROUP_BY

???????? 對于GROUP by聚合操作,如果在select中的列沒有在GROUP BY中出現,那么sql語句是不合法的,因為a列不在group by從句中。

mysql>select id,sum(date) from tt group by date;

+----+----------------+

| id |sum(date)????? |

+----+----------------+

|? 2 |????????????? 0 |

|? 1 | 20141202000000 |

+----+----------------+

2 rows inset (0.00 sec)

?

mysql>set sql_mode='ONLY_FULL_GROUP_BY';

Query OK,0 rows affected (0.00 sec)

?

mysql>select id,sum(date) from tt group by date;

ERROR1055 (42000): 'gf.tt.id' isn't in GROUP BY

mysql>

1.1.16.?PAD_CHAR_TO_FULL_LENGTH

???????? 對于char類型,不要截斷空洞數據。空洞數據就是自動填充值為0x20的數據。

???????? 默認情況下:

mysql>create table ttt(a char(5));

Query OK,0 rows affected (0.01 sec)

?

mysql>insert into ttt select 'a';

Query OK,1 row affected (0.00 sec)

Records:1? Duplicates: 0? Warnings: 0

?

mysql>select a,char_length(a),hex(a) from ttt;

+------+----------------+--------+

| a??? | char_length(a) | hex(a) |

+------+----------------+--------+

| a??? |????????????? 1 | 61???? |

+------+----------------+--------+

1 row inset (0.00 sec)

???????? 默認字符長度為1,數據庫對后面的空洞數據進行了截斷。

mysql>set sql_mode='pad_char_to_full_length';

Query OK,0 rows affected (0.00 sec)

?

mysql>select a,char_length(a),hex(a) from ttt;

+-------+----------------+------------+

| a???? | char_length(a) | hex(a)???? |

+-------+----------------+------------+

| a???? |????????????? 5 | 6120202020 |

+-------+----------------+------------+

1 row inset (0.00 sec)

???????? 反映的是實際存儲的內容。

1.1.17.?PIPES_AS_CONCAT

???????? 將“||”視為字符串的聯接操作符而非運算符,這個和oracle數據庫是一樣的,也和字符串的拼接函數concat相類似。

mysql>select 'a'||'b'||'c';

+---------------+

|'a'||'b'||'c' |

+---------------+

|???????????? 0 |

+---------------+

1 row inset, 3 warnings (0.00 sec)

?

mysql>show warnings;

+---------+------+---------------------------------------+

|Level?? | Code | Message?????????????????????????????? |

+---------+------+---------------------------------------+

| Warning| 1292 | Truncated incorrect DOUBLE value: 'a' |

| Warning| 1292 | Truncated incorrect DOUBLE value: 'b' |

| Warning| 1292 | Truncated incorrect DOUBLE value: 'c' |

+---------+------+---------------------------------------+

3 rows inset (0.00 sec)

?

mysql>set sql_mode='pipes_as_concat';

Query OK,0 rows affected (0.00 sec)

?

mysql>select 'a'||'b'||'c';

+---------------+

|'a'||'b'||'c' |

+---------------+

|abc?????????? |

+---------------+

1 row inset (0.00 sec)

?

1.1.18.?REAL_AS_FLOAT

???????? real視為float的同義詞而不是double的同義詞。

1.1.19.?STRICT_ALL_TABLES

???????? 對所有引擎的表都啟用嚴格模式。STRICT_TRANS_TABLES只對支持事務的表啟用嚴格模式。

???????? 在嚴格模式下,一旦任何操作的數據產生問題,都會終止當前的操作。

???????? 對于啟用STRICT_ALL_TABLES選項的非事務引擎來說,這時數據可能停留在一個未知的狀態,這可能不是所有非事務引擎原意看到的一種情況,因此需要非常小心這個選項可能帶來的潛在影響。

1.1.20.?SQL_MODE的選項組合

?

名稱

等同于選項

ANSI

REAL_AS_FLOATPIPES_AS_CONCAT、ANSI_QUOTESIGNORE_SPACE

ORACLE

REAL_AS_FLOAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONSNP_TABLE_OPTIONSNO_FIELD_OPTIONS、NO_AUTO_CREATE_USER

TRADITIONAL

STRICT_TRANS_TABLESSTRICT_ALL_TABLESNO_ZERO_DATENO_ZERO_IN_DATEERROT_FOR_DIVIDION_BY_ZERO、NO_ AUTO_CREATE_USER、NO_ENGINE_SUBSTITITION

MSSQL

PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONS、NP_TABLE_OPTIONS、NO_FIELD_OPTIONS

DB2

PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONSNP_TABLE_OPTIONS、NO_FIELD_OPTIONS

MYSQL323

NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE

MYSQL40

NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE

MAXDB

PIPES_AS_CONCATANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NP_TABLE_OPTIONSNO_FIELD_OPTIONS、NO_AUTO_CREATE_USER


轉載于:https://blog.51cto.com/gfsunny/1585353

總結

以上是生活随笔為你收集整理的SQL_MODE设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。