Mysql中校對集utf8_unicode_ci與utf8_general_ci的區別

來源:互聯網
上載者:User

標籤:使用   os   資料   ar   問題   工作   linux   amp   

一直對utf8_unicode_ci與utf8_general_ci這2個校對集很迷惑,今天查了手冊有了點眉目。不過對中文字元集來說採用utf8_unicode_ci與utf8_general_ci時有何區別還是不清楚?

下面摘錄一下Mysql 5.1中文手冊中關於utf8_unicode_ci與utf8_general_ci的說明:

 

     當前,utf8_unicode_ci校對規則僅部分支援Unicode校對規則演算法。一些字元還是不能支援。並且,不能完全支援組合的記號。這主要影響越南和俄羅斯的一些少數民族語言,如:Udmurt 、Tatar、Bashkir和Mari。

 

     utf8_unicode_ci的最主要的特色是支援擴充,即當把一個字母看作與其它字母組合相等時。例如,在德語和一些其它語言中‘ß’等於‘ss’。

 

     utf8_general_ci是一個遺留的 校對規則,不支援擴充。它僅能夠在字元之間進行逐個比較。這意味著utf8_general_ci校對規則進行的比較速度很快,但是與使用utf8_unicode_ci的 校對規則相比,比較正確性較差)。

 

     例如,使用utf8_general_ci和utf8_unicode_ci兩種 校對規則下面的比較相等:

     Ä = A

     Ö = O

     Ü = U

 

     兩種校對規則之間的區別是,對於utf8_general_ci下面的等式成立:

     ß = s

 

     但是,對於utf8_unicode_ci下面等式成立:

     ß = ss

 

     對於一種語言僅當使用utf8_unicode_ci排序做的不好時,才執行與具體語言相關的utf8字元集 校對規則。例如,對於德語和法語,utf8_unicode_ci工作的很好,因此不再需要為這兩種語言建立特殊的utf8校對規則。

 

     utf8_general_ci也適用與德語和法語,除了‘ß’等於‘s’,而不是‘ss’之外。如果你的應用能夠接受這些,那麼應該使用utf8_general_ci,因為它速度快。否則,使用utf8_unicode_ci,因為它比較準確。

 

如果你想使用gb2312編碼,那麼建議你使用latin1作為資料表的預設字元集,這樣就能直接用中文在命令列工具中插入資料,並且可以直接顯示出來.而不要使用gb2312或者gbk等字元集,如果擔心查詢排序等問題,可以使用binary屬性約束,例如:

create table my_table ( name varchar(20) binary not null default ‘‘)type=myisam default charset latin1;

 

附1:舊資料升級辦法

以原來的字元集為latin1為例,升級成為utf8的字元集。原來的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。

第一步:匯出舊資料

mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql

第二步:轉換編碼(類似unix/linux環境下)

iconv -t utf-8 -f gb2312 -c old.sql > new.sql

或者可以去掉 -f 參數,讓iconv自動判斷原來的字元集

iconv -t utf-8 -c old.sql > new.sql

在這裡,假定原來的資料預設是gb2312編碼。

第三步:匯入

修改old.sql,在插入/更新語句開始之前,增加一條sql語句: "SET NAMES utf8;",儲存。

mysql -hlocalhost -uroot my_db < new.sql

大功告成!!

 

附2:支援查看utf8字元集的MySQL用戶端有

1.) MySQL-Front,據說這個項目已經被MySQL AB勒令停止了,不知為何,如果國內還有不少破解版可以下載(不代表我推薦使用破解版 :-P)。

2.) Navicat,另一款非常不錯的MySQL用戶端,漢化版剛出來,還邀請我試用過,總的來說還是不錯的,不過也需要付費。

3.) PhpMyAdmin,開源的php項目,非常好。

4.) Linux下的終端工具(Linux terminal),把終端的字元集設定為utf8,串連到MySQL之後,執行 SET NAMES UTF8; 也能讀寫utf8資料了。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.