Mysql自4.1以後,增加了對字符集的支持。筆者之前對Mysql比較了解,剛接觸4.1時,感覺MySQL有點多此一舉,但後來細想發現,對字符集的支持,雖然對開發者來說,會麻煩一些,但不可否認,是一種進步。對字符集的支持,不僅更加支持多語言,而且,也方便移植。
剛開始使用Mysql4.1,你可能感覺有點不適,下面,簡單闡述一下筆者對MySQL4.1字符集的理解,再講述如何PHP如何適應MySQL的這種變化,希望大家看過這文章後,能夠有所收獲。
如果你對計算機基礎知識不了解,請直接閱讀“結論篇”
一.原理篇
MySQL的字符集裡有兩個概念,一個是“Character set(字符集)”,另一個是“Collations”。
1. Collations
Collations翻成中文是“校驗”,在網頁開發的過程中,這個詞匯,只在Mysql裡使用,主要作用是指導MySQL對字符的比較,比如, ASCII字符集裡,Collations規定了a小於b,a等於a,以及a是否等於A之類的。通常,大家基本可以忽略Collations的存在,因為每個字符集都有一個默認的Collations,通常,使用默認的Collations就可以了。
2.字符集
與這對比的是,字符集是個更廣的概念,即使是Windows下普通的文本文件,也滲及到字符集的問題。不同的字符集,規定了不同的字符的編碼方式。一個 character set (字符集)是一組符號和編碼,比如,ASCII字符集,包括的字符有:數字,大小寫字母,分號、換行之類的符號,編碼方式是用一個7bit表示一個字符(A的編碼是65,b的編碼是98)。ASCII只規定了英文字母的編碼,非英文語言不能用ASCII編碼表示,為此,不同的國家,都為自己的語言做了編碼,比如,我們國家,就有GB2312編碼。但每個國家之間的編碼不同,也存在著一些跨平台的問題,為此,一些國際化標准組織,就制定了一些國際通用的編碼,最常用的就是UTF8了。ASCII只對英文符號和英文字母做了編碼,GB2312對英文符號,英文字母,漢字做了編碼,UTF8對世界上所有的語言文字做了編碼,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。由此可見,UTF8是所含最廣字符的字符集,所以,在一些多語言的WEB系統中,一般用UTF8字符集(PHPMyAdmin使用UTF8編碼)。
任何文本的存儲,都滲及到字符集的概念。包括數據庫,也包括普通的文本文件。
主要術語:
字符:漢字,英文字母,標點符號,拉丁文等等。
編碼:將字符轉換成計算機存儲的格式,比如,A用65表示。
字符集:一組字符以及對應的編碼方式。
a. MySQL的字符集
MySQL目前支持多字符集,並且,支持在不同的字符集之間轉換(便於移植和支持多語言)。
MySQL可以設置服務器級字符集、數據庫級字符集、數據表級字符集、表列的字符集,實際上,最終使用字符集的地方是存儲字符的列,比如,你設置 table1中col1列是字符類型,col1才用到了字符集,如果table1表的col2列是int類型,col2不使用字符集的概念。
服務器級字符集、數據庫級字符集、數據表級字符集都是為列的字符集做默認選項的。
Mysql一定有一個字符集,可以通過啟動時加參數指定,也可以編譯時指定,也可以在配置文件裡指定。MySQL服務器字符集,只是做為數據庫級的默認值。創建數據庫時,你可以指定字符集,如果沒指定,就使用服務器的字符集。同理,創建表時,你可以指定表級的字符集,如果沒指定,使用數據庫的字符集做為表的字符集。創建列時,你可以指定某列的字符集,如果沒指定,就使用表的字符集。
通常情況下,您只需設置服務器級的字符集,其它的數據庫級,表級,以及列級的字符集,都繼承自服務器級字符集。
由於UTF8是最廣的字符集,所以,一般情況下,我們設置MySQL服務器級的字符集為UTF8!
b. 普通文本的字符集問題
任何文本的存儲,都存在著字符集的問題,普通文本文件也不例外。
Windows2000+的系統中,打開記事本,“保存為…”對話框,就有一個選項,可以讓你選擇存儲文本的編碼方式。
通常情況下,大家都使用Windows2000+的系統,都使用默認的編碼,所以,不會碰到字符集的問題。
Windows下,保存文本文件時,可以選擇編碼方式,但打開文本文件時,都是自動判斷編碼方式的。網上有一個用Windows2000+的記事本玩移動,聯通的笑話,大家可以搜搜,就是因為Windows在打開文本文件時,編碼判斷錯誤引起的問題。
因為自動判斷編碼有時會錯誤,所以,有的文本文件,規定了如何識別自身所使用的編碼。