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