·服務器字符集和校對規則可以用作character_set_server和collation_server變量的值。
·默認數據庫的字符集和校對規則可以用作character_set_database和collation_database變量的值。
在客戶端和服務器的連接處理中也涉及了字符集和校對規則變量。每一個客戶端有一個連接相關的字符集和校對規則變量。
考慮什麼是一個“連接”:它是連接服務器時所作的事情。客戶端發送SQL語句,例如查詢,通過連接發送到服務器。服務器通過連接發送響應給客戶端,例如結果集。對於客戶端連接,這樣會導致一些關於連接的字符集和 校對規則的問題,這些問題均能夠通過系統變量來解決:
·當查詢離開客戶端後,在查詢中使用哪種字符集?
服務器使用character_set_clIEnt變量作為客戶端發送的查詢中使用的字符集。
·服務器接收到查詢後應該轉換為哪種字符集?
轉換時,服務器使用character_set_connection和collation_connection系統變量。它將客戶端發送的查詢從character_set_clIEnt系統變量轉換到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介詞)。collation_connection對比較文字字符串是重要的。對於列值的字符串比較,它不重要,因為列具有更高的 校對規則優先級。
·服務器發送結果集或返回錯誤信息到客戶端之前應該轉換為哪種字符集?
character_set_results變量指示服務器返回查詢結果到客戶端使用的字符集。包括結果數據,例如列值和結果元數據(如列名)。
你能夠調整這些變量的設置,或可以依賴默認值(這樣,你可以跳過本章)。
有兩個語句影響連接字符集:
SET NAMES 'charset_name'
SET CHARACTER SET charset_name
SET NAMES顯示客戶端發送的SQL語句中使用什麼字符集。因此,SET NAMES 'cp1251'語句告訴服務器“將來從這個客戶端傳來的信息采用字符集cp1251”。它還為服務器發送回客戶端的結果指定了字符集。(例如,如果你使用一個SELECT語句,它表示列值使用了什麼字符集。)
SET NAMES 'x'語句與這三個語句等價:
MySQL> SET character_set_clIEnt = x;
MySQL> SET character_set_results = x;
MySQL> SET character_set_connection = x;
將x設置為character_set_connection也就設置了collation_connection是x的默認校對規則。
SET CHARACTER SET語句是類似的,但是為 默認數據庫設置連接字符集和校對規則。SET CHARACTER SET x語句與這三個語句等價:
MySQL> SET character_set_clIEnt = x;
MySQL> SET character_set_results = x;
MySQL> SET collation_connection = @@collation_database;
當一個客戶端連接時,它向服務器發送希望使用的字符集名稱。服務器為那個字符集設置character_set_clIEnt、character_set_results和 character_set_connection變量。(實際上,服務器為使用該字符集執行一個SET NAMES操作。)
對於mysql客戶端,如果你希望使用與默認字符集不同的字符集,不需要每次啟動時執行SET NAMES語句。可以在mysql語句行中或者選項文件中添加一個--default-character-set選項設置。例如,你每次運行MySQL時,以下的選項文件設置把三個字符集變量修改為koi8r:
[MySQL]
default-character-set=koi8r
例如:假設column1定義為CHAR(5) CHARACTER SET latin2。如果沒有設定SET NAMES或SET CHARACTER SET,那麼對於SELECT column1 FROM t,當連接後,服務器使用客戶端指定的字符集返回列column1的所有值。另一方面,如果你設定SET NAMES 'latin1'或SET CHARACTER SET latin1,那麼發送結果之前,服務器轉換latin2值到latin1。轉換可能會丟失那些不屬於兩種字符集的字符。
如果不希望服務器執行任何轉換,設置character_set_results為NULL:
MySQL> SET character_set_results = NULL;