在mysql中如果不為NOT NULL字段賦值(等同于賦NULL值)也就是說,MySQL中NOT NULL并不是一個(gè)約束條件了
一、關(guān)于空值
提示:
在MySQL中如果不為NOT NULL字段賦值(等同于賦NULL值)
例如:
為一個(gè)NOT NULL的整型賦NULL值,結(jié)果是0,它并不會(huì)出錯(cuò),
為一個(gè)NOT NULL的CHAR型賦NULL值,結(jié)果是”(空字符串)
DATATIME
-> ‘0000-00-00 00:00:00 ‘
MySQL會(huì)自動(dòng)將NULL值轉(zhuǎn)化為該字段的默認(rèn)值, 那怕是你在表定義時(shí)沒有明確地為該字段設(shè)置默認(rèn)值.
也就是說,MySQL中NOT NULL并不是一個(gè)約束條件了.
如果字段設(shè)置為可空,則插入記錄時(shí)如果沒有給該字段賦值,那么MySQL自動(dòng)用Default的值,如果沒有設(shè)置Default,則無論是該字段是什么類型該字段值為NULL.
字段是否可空,雖然不是一個(gè)約束條件,卻會(huì)改變系統(tǒng)賦默認(rèn)值的方式。
疑問:以上規(guī)則是否僅限于MyIsam表,InnoDB呢??也是這樣處理的嗎??
連接字符集和校對(duì)
character_set_server和collation_server 服務(wù)器字符集和校對(duì)規(guī)則
character_set_database和collation_database 默認(rèn)的數(shù)據(jù)庫(kù)字符集和校對(duì)規(guī)則
#當(dāng)查詢離開客戶端后,在查詢中使用哪種字符集?
服務(wù)器使用character_set_client變量作為客戶端發(fā)送的查詢中使用的字符集。
#服務(wù)器接收到查詢后應(yīng)該轉(zhuǎn)換為哪種字符集?
服務(wù)器將客戶端發(fā)送的查詢從character_set_client轉(zhuǎn)換到character_set_connection
#服務(wù)器發(fā)送結(jié)果集或返回錯(cuò)誤信息到客戶端之前應(yīng)該轉(zhuǎn)換為哪種字符集?
character_set_results變量指示服務(wù)器返回查詢結(jié)果到客戶端使用的字符集。
包括結(jié)果數(shù)據(jù)(列值)和結(jié)果元數(shù)據(jù)(列名)。
有兩個(gè)語(yǔ)句影響連接字符集:
SET NAMES ‘charset_name’
SET CHARACTER SET charset_name
SET NAMES ‘x’語(yǔ)句與這三個(gè)語(yǔ)句等價(jià):
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;
SET CHARACTER SET x語(yǔ)句與這三個(gè)語(yǔ)句等價(jià):
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET collation_connection = @@collation_database; (設(shè)置為默認(rèn)的數(shù)據(jù)庫(kù)連接字符集和校對(duì)規(guī)則)
深入Mysql字符集設(shè)置
用于元數(shù)據(jù)的UTF8
元數(shù)據(jù)是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”。描述數(shù)據(jù)庫(kù)的任何數(shù)據(jù)—作為數(shù)據(jù)庫(kù)內(nèi)容的對(duì)立面—是元數(shù)據(jù)。因此,列名、數(shù)據(jù)庫(kù)名、用戶名、版本名以及從SHOW語(yǔ)句得到的結(jié)果中的大部分字符串是元數(shù)據(jù)。還包括INFORMATION_SCHEMA數(shù)據(jù)庫(kù)中的表中的內(nèi)容,因?yàn)槎x的那些表存儲(chǔ)關(guān)于數(shù)據(jù)庫(kù)對(duì)象的信息。
元數(shù)據(jù)表述必須滿足這些需求:
· 全部元數(shù)據(jù)必須在同一字符集內(nèi)。否則,對(duì)INFORM一個(gè)TION_SCHEMA數(shù)據(jù)庫(kù)中的表執(zhí)行的SHOW命令和SELECT查詢不能正常工作,因?yàn)檫@些運(yùn)算結(jié)果中的同一列的不同行將會(huì)使用不同的字符集。
· 元數(shù)據(jù)必須包括所有語(yǔ)言的所有字符。否則,用戶將不能夠使用它們自己的語(yǔ)言來命名列和表。
為了滿足這兩個(gè)需求,MySQL使用Unicode字符集存儲(chǔ)元數(shù)據(jù),即UTF8。
服務(wù)器將character_set_system系統(tǒng)變量設(shè)置為元數(shù)據(jù)字符集的名:
mysql> SHOW VARIABLES LIKE ‘character_set_system’;
mysql> SHOW VARIABLES LIKE ‘character%’;查看當(dāng)前數(shù)據(jù)庫(kù)的字符集設(shè)置情況