字元集是指一種從二進位編碼到某類字元符號的映射,校對是一組用於某個字元集的排序規則。每一類編碼字元都有其對應的字元集和校對規則 ...
字元集是指一種從二進位編碼到某類字元符號的映射,校對是一組用於某個字元集的排序規則。每一類編碼字元都有其對應的字元集和校對規則
MySQL 如何使用字元集
每種字元集都可能有多種校對規則,並且都有一個預設的校對規則。每個校對規則都是針對某個特定的字元集的,和其他的字元集都沒有關係。校對規則和字元集總是一起使用的,我們也將這樣的組合統稱為一個字元集。
MySQL的設置可以分為兩類:創建對象時的預設值、在伺服器和客戶端通信時的設置。
創建對象時的預設值
MySQL伺服器有預設的字元集和校對規則,每個資料庫、數據表也有自己的預設值。這是一個逐層繼承的預設設置,最終最靠底層的預設設置將影響我們創建的對象。這些預設值,從上而下地告訴MySQL應該使用什麼字元集來存儲某個列。
在這個階梯的每一層,你都可以指定一個特定的字元集或者讓伺服器使用它的預設值:
- 在創建資料庫的時候,將根據伺服器上的 character_set_server 設置來設定該資料庫的預設字元集
- 創建表的時候,將根據資料庫的字元集設置指定這個表的字元集設置
- 創建列的時候,將根據表的設置指定列的字元集設置
需要註意的是: 真正存放數據的是列,所以更高“階梯”的設置只是指定預設值。一個表的預設字元集設置無法影響存儲在這個表中某個列的值。只有當創建列而沒有列指定字元集的時候,如果沒有指定字元集,表的預設字元集才有作用。
伺服器和客戶端通信時的設置
當伺服器和客戶端通信的時候,他們可能使用不同的字元集。這時,伺服器端將進行必要的翻譯轉換工作,如圖所示:
根據需要,可以使用 SET NAMES 或者 SET CHARACTER SET 語句來改變上面的設置。不過在伺服器上使用這個命令只會改變伺服器端的設置。客戶端程式和客戶端的API也需要使用正確的字元集才能避免在通信時出現問題。
選擇字元集和校對規則
在一個資料庫中使用多個不同的字元集是一件很讓人頭疼的事情,字元集之間不相容問題會很難纏。有時候一切看起來很正常,但是當某個特殊字元出現的時候,所有類型的操作可能都無法進行。
正確的方法是,最好先為伺服器(或者資料庫) 選擇一個合理的字元集。然後根據不同的實際情況,讓某些列選擇合適的字元集。
下麵展示了在創建資料庫、表、列的時候如何顯式地指定字元集和校對規則:
CREATE DATABASE d CHARSET latin1;
CREATE TABLE d.t(
col1 CHAR(1),
col2 CHAR(1) CHARSET utf8,
col3 CHAR(1) COLLATE latin1_bin
)DEFAULT CHARSET=cp1251;
這個表最後的字元集和校對規則如下:
Field | Type | Collation |
---|---|---|
col1 | char(1) | cp1251_general_ci |
col2 | char(!) | utf8_general_ci |
col3 | char(!) | latin1_bin |
字元集和校對規則如何影響查詢
某些字元集和校對規則可能會需要更多的CPU操作,可能會消耗更多的記憶體和存儲空間,甚至還會影響索引的正常操作。
只有在排序查詢要求的字元集和伺服器數據的字元集相同的時候,才能使用索引進行排序。索引根據數據列的校對規則進行排序。如果希望使用別的校對規則進行排序,那麼MySQL就需要使用文件排序。