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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql SQL Mode详解

發(fā)布時間:2025/4/5 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql SQL Mode详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Mysql SQL Mode簡介

MySQL服務(wù)器能夠工作在不同的SQL模式下,并能針對不同的客戶端以不同的方式應(yīng)用這些模式。這樣,應(yīng)用程序就能對服務(wù)器操作進(jìn)行量身定制以滿足自己的需求。這類模式定義了MySQL應(yīng)支持的SQL語法,以及應(yīng)該在數(shù)據(jù)上執(zhí)行何種確認(rèn)檢查。這樣,就能在眾多不同的環(huán)境下、與其他數(shù)據(jù)庫服務(wù)器一起更容易地使用MySQL??梢允褂谩?-sql-mode="modes"”選項,通過啟動mysqld來設(shè)置默認(rèn)的SQL模式。從MySQL 4.1開始,也能在啟動之后,使用SET [SESSION|GLOBAL] sql_mode='modes'語句,通過設(shè)置sql_mode變量更改模式。

通常在linux下安裝完mysql后,默認(rèn)的sql-mode值是空,在這種情形下mysql執(zhí)行的是一種不嚴(yán)格的檢查,例如日期字段可以插入’0000-00-00 00:00:00’這樣的值,還有如果要插入的字段長度超過列定義的長度,那么mysql不會終止操作,而是會自動截斷后面的字符繼續(xù)插入操作,如下例:
? ? mysql> create table t5 (c1 char(3));
? ? mysql> insert into t5 values('abcd');
? ? mysql> select * from t5;
? ? +------+
? ? | c1?? |
? ? +------+
? ? | abc? |
? ? +------+
? ? 1 row in set (0.00 sec)

我們發(fā)現(xiàn)插入的字符被自動截斷了,但是如果我們本意希望如果長度超過限制就報錯,那么我們可以設(shè)置sql_mode為STRICT_TRANS_TABLES,如下:
? ? mysql> set session sql_mode='STRICT_TRANS_TABLES'
這樣我們再執(zhí)行同樣的操作,mysql就會告訴我們插入的值太長,操作被終止,如下:
? ? mysql> insert into t5 values('abcd');
? ? ERROR 1406 (22001): Data too long for column 'c1' at row 1

經(jīng)常使用的sql_mode值Sql_mode值描述
ANSI更改語法和行為,使其更符合標(biāo)準(zhǔn)SQL。
STRICT_TRANS_TABLES如果不能將給定的值插入到事務(wù)表中,則放棄該語句。對于非事務(wù)表,如果值出現(xiàn)在單行語句或多行語句的第1行,則放棄該語句。本節(jié)后面給出了更詳細(xì)的描述。
TRADITIONALMake MySQL的行為象“傳統(tǒng)”SQL數(shù)據(jù)庫系統(tǒng)。該模式的簡單描述是當(dāng)在列中插入不正確的值時“給出錯誤而不是警告”。注釋:一旦發(fā)現(xiàn)錯誤立即放棄INSERT/UPDATE。如果你使用非事務(wù)存儲引擎,這種方式不是你想要的,因為出現(xiàn)錯誤前進(jìn)行的數(shù)據(jù)更改不會“滾動”,結(jié)果是更新“只進(jìn)行了一部分”。

說明:如果把sql_mode的值設(shè)置成后面的兩個值(也就是我們說的嚴(yán)格模式),那么當(dāng)在列中插入或更新不正確的值時,mysql將會給出錯誤,并且放棄insert/update操作。在我們的一般應(yīng)用中建議使用這兩種模式,而不是使用默認(rèn)的空或ANSI模式。但是需要注意的問題是,如果數(shù)據(jù)庫運(yùn)行在嚴(yán)格模式下,并且你的存儲引擎不支持事務(wù),那么有數(shù)據(jù)不一致的風(fēng)險存在,比如一組sql中有兩個dml語句,如果后面的一個出現(xiàn)了問題,但是前面的已經(jīng)操作成功,那么mysql并不能回滾前面的操作。因此說設(shè)置sql_mode需要應(yīng)用人員權(quán)衡各種得失,從而得到一個合適的選擇。

Sql_mode的值還有很多,這里不再累述,可以參考相關(guān)的手冊。

SQL Mode與可移植性

如果mysql與其它異構(gòu)數(shù)據(jù)庫之間有數(shù)據(jù)移植的需求的話,那么下面的sql_mode的組合設(shè)置可以達(dá)到相應(yīng)的效果:
數(shù)據(jù)庫Sql_mode值
DB2PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS
MAXDBPIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER
MSSQLPIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS
ORACLEPIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER
POSTGRESQLPIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS
?

SQL Mode與數(shù)據(jù)效驗

SQL Mode 還可以實現(xiàn)對數(shù)據(jù)效驗和轉(zhuǎn)移等功能如:
  • 效驗日期數(shù)據(jù)合法性.
  • 在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產(chǎn)生錯誤
  • 將‘"’視為識別符引號(‘`’引號字符)
  • 禁用反斜線字符(‘\’)做為字符串內(nèi)的退出字符。啟用NO_BACKSLASH_ESCAPES模式,反斜線則成為普通字符。
  • 將||視為字符串連接操作符(+)(同CONCAT()),而不視為OR
  • 轉(zhuǎn)載于:https://www.cnblogs.com/xiaowangba/p/6314155.html

    總結(jié)

    以上是生活随笔為你收集整理的Mysql SQL Mode详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。