天天看點

看mysql手冊中模式(SQL_MODE)學到的知識

使用phpmyadmin導出sql的時候,常常會出現SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";的語句。通過看sql手冊,明白了這裡

設定的含義。

那麼可以回答幾個疑惑性問題了

一、設定sql模式有什麼作用?會産生什麼方面的影響?

模式定義mysql會支援哪些sql文法。以及應執行哪種資料驗證檢查。最終達到的目标:适應在不同環境中适應mysql,因為可

以根據各自的程式不同設定對于德sql操作模式。輸入如下語句可以知道,目前使用的sql模式,select @@sql_mode

比如,NO_AUTO_VALUE_ON_ZERO模式下,根據字面意思,沒有自動增量為0的值。

二、做一個實驗:

步驟1.SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"  您運作的 SQL 語句已經成功運作了。

2. SELECT @@sql_mode

@@sql_mode

 為什麼結果是空呢?沒有設定成功嗎?

原因分析:可能是是在phpmyadmin中運作語句的。因為我在mysql用戶端運作結果,能夠看到設定後的sql模式結果。此時在

phpmyadmin中卻看不到設定好的模式。那一項的結果是空。

3.插入一條資料

INSERT INTO `julebu`.`matches` (

`MATCHNO` ,

`TEAMNO` ,

`PLAYERNO` ,

`WON` ,

`LOST`

)

VALUES (

'0', 'gg', 'ghh', 'hhh', 'hh'

);

主鍵字段的值插入的值是0.結果看到,儲存的并不是0,而變成了1。也正好說明了sql模式"NO_AUTO_VALUE_ON_ZERO"起作用

了。不允許自動增量的值為0(手冊:MySQL遇到0值一般會生成新的序列号).經過進一步插入資料測試,注意了解這裡的新序

列号:是生成新的序列号。遇到0,假如原來表中已經有個序列号是3,那麼就會生成4.接着原來序列号的自增。

結束//////////////////////////////////////////////////////

知識收集:

預設sql模式是為空的。非嚴格模式,難怪我們平時,插入一個字段,資料超過字段,不會報錯,會自動截斷存儲。

使用嚴格模式(STRICT_TRANS_TABLES),插入的資料超過字段長度,比如常見的char字段類型,會報錯,ERROR 1406 (22001): Data too long for column 'testchar' at row 1。

還有日期類型的字段。如果設定的值超過日期大小,也不會報錯。

經驗:mysql之是以預設設定為空。非嚴格模式,也是有道理的。這樣容錯性強。給一個設定級别給大家,也是可以友善自己根據需要來調試,一般是不太會使用嚴格模式的,嚴格模式造成程式很難跑起來,遇到點超過字段長度的錯誤,都會影響運作。