1. 程式人生 > 資料庫 >MySQL必知必會——第27章 全球化和本地化 讀書筆記

MySQL必知必會——第27章 全球化和本地化 讀書筆記

本章介紹MySQL處理不同字符集和語言的基礎知識。

1 字符集和校對順序
資料庫表用來儲存和檢索資料。
不同的語言和字符集需要以不同的方式儲存和檢索。因此MySQL需要適應不同的字符集(不同的字母和字元),適用不同的排序和檢索資料的方法
在討論多種語言和字符集時,將會遇到以下重要術語:
①字符集為字母和符號的集合;
②編碼為某個字符集成員的內部表示;
校隊為規定字元如何比較的指令
校隊為什麼重要?
排序英文正文很容易,對嗎?這有賴於你是否想區分大小寫。使用區分大小寫的校對順序,這些詞有一種排序方式,使用不區分大小寫的校對順序有另外一種排序方式。
這不僅影響排序(如用order by排序資料),還影響搜尋(例如,尋找apple的where子句是否能找到APPLE)

在使用法文或德文這樣的字元時,情況更復雜,在使用不基於拉丁文的字符集時,情況更為複雜。
在MySQL的正常資料庫活動(select,insert等),不需要操心太多的東西。使用何種字符集和校對的決定在伺服器、資料庫和表級進行
2 使用字符集和校對順序
MySQL支援眾多的字符集。為檢視所支援的字符集完整列表,使用以下語句:

show character set;

這條語句顯示所有可用的字符集以及每個字符集的描述和預設校對。
為了檢視所支援校對的完整列表,使用以下語句:

show collation;

collation是校對的意思。
此語句顯示所有可用的校對,以及它們適用的字符集。可以看到有的字符集具有不止一種校對

。例如,latin1對不同的歐洲語言有幾種校對,而且許多校對出現兩次,一次區分大小寫(由_cs表示),一次不區分大小寫(由_ci表示)。
通常系統管理在安裝時定義一個預設的字符集和校對。也可以在建立資料庫時,指定預設的字符集和校對。為了確定所用的字符集和校對,可以使用以下語句:

show variables like 'character%';
show variables like 'collation%';

實際上,字符集很少是伺服器範圍(甚至資料庫範圍)的設定。不同的表,甚至不同的列都可能需要不同的字符集,而且兩者都可以在建立表時指定。
為了給表指定字符集和校對,可使用帶子句的create table:

create table mytable
(
  column1 int,column2 varchar(10)
)default character set hebrew
 collate hebrew_general_ci;

此語句建立一個包含兩列的表,並且指定一個字符集和一個校對順序。
這個例子中指定了character set和collate兩者。
一般,MySQL如下確定使用什麼樣的字符集和校對:
①如果指定character set和collate兩者,則使用這些值;
②如果只指定character set,則使用此字符集及其預設的校對(如show character set中的結果中所示)。
③如果既不指定character set,也不指定collate,則使用資料庫預設。
除了能指定字符集和校對的表範圍,MySQL還允許對每個列設定它們,如下所示:

create table mytable
(
  column1 int,column2 varchar(10),column3 varchar(10) character set latin1 collate latin1_general_ci
)
default character set hebrew collate hebrew_general_ci; 

這裡對整個表以及一個特定的列指定了character set和collate。
如前所述,校對在對用order by子句檢索出來的資料排序時起重要的作用。如果你需要用與建立表時不同的校對順序排序特定的select語句,可以在select語句自身中進行:

select * from customers
order by lastname,firstname collate latin1_general_cs;

此select使用collate指定一個備用的校對順序(在這個例子中為了區分大小寫的校對)。這顯然將會影響到結果排序的次序。
臨時區分大小寫:上面的select語句演示了在通常不區分大小寫的表上進行區分大小寫搜尋的一種技術。當然,反過來也是可以的。
select的其他collate子句:除了這裡看到的在order by子句中使用以外,collate還可以用於group by,having,聚集函式,別名等。
最後,值得注意的是,如果絕對需要,串可以在字符集之間進行轉換。為此可以使用Cast()或Convert()函式。

小結
本章中,我們學習了字符集和校對的基礎知識,還學習瞭如何對特定的表和列定義字符集和校對,如何在需要時使用備用的校對。