《Mysql必讀Mysql之SQL Mode用法詳解》要點(diǎn):
本文介紹了Mysql必讀Mysql之SQL Mode用法詳解,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
一、Mysql SQL Mode簡介MYSQL應(yīng)用
通常來說MySQL服務(wù)器能夠工作在不同的SQL模式下,并能針對(duì)不同的客戶端以不同的方式應(yīng)用這些模式.這樣,應(yīng)用程序就能對(duì)服務(wù)器操作進(jìn)行量身定制以滿足本身的需求.這類模式定義了MySQL應(yīng)支持的SQL語法,以及應(yīng)該在數(shù)據(jù)上執(zhí)行何種確認(rèn)檢查.這樣,就能在眾多不同的環(huán)境下、與其他數(shù)據(jù)庫服務(wù)器一起更容易地使用MySQL.可以使用“--sql-mode="modes"”選項(xiàng),通過啟動(dòng)mysqld來設(shè)置默認(rèn)的SQL模式.而從MySQL 4.1開始,也能在啟動(dòng)之后,使用SET [SESSION|GLOBAL] sql_mode='modes'語句,通過設(shè)置sql_mode變量更改其模式.MYSQL應(yīng)用
通常在linux下安裝完mysql后,其默認(rèn)的sql-mode值是空,在這種情形下mysql執(zhí)行的是一種不嚴(yán)格的檢查,例如日期字段可以插入'0000-00-00 00:00:00'這樣的值,還有如果要插入的字段長度超過列定義的長度,那么mysql不會(huì)終止操作,而是會(huì)自動(dòng)截?cái)嗪竺娴淖址^續(xù)插入操作,如下例:MYSQL應(yīng)用
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)插入的字符被自動(dòng)截?cái)嗔?但是如果我們本意希望如果長度超過限制就報(bào)錯(cuò),那么我們可以設(shè)置sql_mode為STRICT_TRANS_TABLES,如下:MYSQL應(yīng)用
mysql> set session sql_mode='STRICT_TRANS_TABLES'
這樣我們?cè)賵?zhí)行同樣的操作,mysql就會(huì)告訴我們插入的值太長,操作被終止,如下:MYSQL應(yīng)用
mysql> insert into t5 values('abcd'); ERROR 1406 (22001): Data too long for column 'c1' at row 1
經(jīng)常使用的sql_mode值:MYSQL應(yīng)用
MYSQL應(yīng)用
Sql_mode值
描述
ANSI
變動(dòng)語法和行為,使其更符合標(biāo)準(zhǔn)SQL.
STRICT_TRANS_TABLES
如果不能將給定的值插入到事務(wù)表中,則放棄該語句.對(duì)于非事務(wù)表,如果值出現(xiàn)在單行語句或多行語句的第1行,則放棄該語句.本節(jié)后面給出了更詳細(xì)的描述.
TRADITIONAL
Make MySQL的行為象“傳統(tǒng)”SQL數(shù)據(jù)庫系統(tǒng).該模式的簡單描述是當(dāng)在列中插入不正確的值時(shí)“給出錯(cuò)誤而不是警告”.注釋:一旦發(fā)現(xiàn)錯(cuò)誤立即放棄INSERT/UPDATE.如果你使用非事務(wù)存儲(chǔ)引擎,這種方式不是你想要的,因?yàn)槌霈F(xiàn)錯(cuò)誤前進(jìn)行的數(shù)據(jù)變動(dòng)不會(huì)“滾動(dòng)”,結(jié)果是更新“只進(jìn)行了一部分”.
說明:如果把sql_mode的值設(shè)置成后面的兩個(gè)值(也就是我們說的嚴(yán)格模式),那么當(dāng)在列中插入或更新不正確的值時(shí),mysql將會(huì)給出錯(cuò)誤,并且放棄insert/update操作.在我們的一般應(yīng)用中建議使用這兩種模式,而不是使用默認(rèn)的空或ANSI模式.但是需要注意的問題是,如果數(shù)據(jù)庫運(yùn)行在嚴(yán)格模式下,并且你的存儲(chǔ)引擎不支持事務(wù),那么有數(shù)據(jù)不一致的風(fēng)險(xiǎn)存在,好比一組sql中有兩個(gè)dml語句,如果后面的一個(gè)出現(xiàn)了問題,但是前面的已經(jīng)操作成功,那么mysql并不能回滾前面的操作.因此說設(shè)置sql_mode需要應(yīng)用人員權(quán)衡各種得失,從而得到一個(gè)合適的選擇.MYSQL應(yīng)用
Sql_mode的值還有很多,這里不再累述,可以參考相關(guān)的手冊(cè).MYSQL應(yīng)用
二、SQL Mode與可移植性MYSQL應(yīng)用
如果mysql與其它異構(gòu)數(shù)據(jù)庫之間有數(shù)據(jù)移植的需求的話,那么下面的sql_mode的組合設(shè)置可以達(dá)到相應(yīng)的效果:MYSQL應(yīng)用
數(shù)據(jù)庫 | Sql_mode值 |
---|---|
DB2 | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS |
MAXDB | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER |
MSSQL | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS |
ORACLE | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER |
POSTGRESQL | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS |
三、SQL Mode與數(shù)據(jù)效驗(yàn)MYSQL應(yīng)用
SQL Mode 還可以實(shí)現(xiàn)對(duì)數(shù)據(jù)效驗(yàn)和轉(zhuǎn)移等功能如:
1.效驗(yàn)日期數(shù)據(jù)合法性.
2.在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產(chǎn)生錯(cuò)誤
3.將‘"'視為辨認(rèn)符引號(hào)(‘`'引號(hào)字符)
4.禁用反斜線字符(‘\')做為字符串內(nèi)的退出字符.啟用NO_BACKSLASH_ESCAPES模式,反斜線則成為普通字符.
5.將||視為字符串連接操作符(+)(同CONCAT()),而不視為OR.MYSQL應(yīng)用
《Mysql必讀Mysql之SQL Mode用法詳解》是否對(duì)您有啟發(fā),歡迎查看更多與《Mysql必讀Mysql之SQL Mode用法詳解》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/12661.html