ps:創(chuàng)建數(shù)據(jù)庫不知道選擇什么排序規(guī)則取董,轉(zhuǎn)了篇文章棍苹。
Mysql中utf8_general_ci與utf8_unicode_ci有什么區(qū)別呢?在編程語言中茵汰,通常用unicode對中文字符做處理枢里,防止出現(xiàn)亂碼,那么在MySQL里,為什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢栏豺?
一彬碱、官方文檔說明
下面摘錄一下Mysql 5.1中文手冊中關(guān)于utf8_unicode_ci與utf8_general_ci的說明:
代碼如下:
當(dāng)前,utf8_unicode_ci校對規(guī)則僅部分支持Unicode校對規(guī)則算法奥洼。一些字符還是不能支持巷疼。并且,不能完全支持組合的記號(hào)溉卓。這主要影響越南和俄羅斯的一些少數(shù)民族語言皮迟,如:Udmurt 、Tatar桑寨、Bashkir和Mari伏尼。
utf8_unicode_ci的最主要的特色是支持?jǐn)U展,即當(dāng)把一個(gè)字母看作與其它字母組合相等時(shí)尉尾。例如爆阶,在德語和一些其它語言中‘?'等于‘ss'。
utf8_general_ci是一個(gè)遺留的 校對規(guī)則沙咏,不支持?jǐn)U展辨图。它僅能夠在字符之間進(jìn)行逐個(gè)比較。這意味著utf8_general_ci校對規(guī)則進(jìn)行的比較速度很快肢藐,但是與使用utf8_unicode_ci的 校對規(guī)則相比故河,比較正確性較差)。
例如吆豹,使用utf8_general_ci和utf8_unicode_ci兩種 校對規(guī)則下面的比較相等:
? = A
? = O
ü = U
兩種校對規(guī)則之間的區(qū)別是鱼的,對于utf8_general_ci下面的等式成立:
? = s
但是,對于utf8_unicode_ci下面等式成立:
? = ss
對于一種語言僅當(dāng)使用utf8_unicode_ci排序做的不好時(shí)痘煤,才執(zhí)行與具體語言相關(guān)的utf8字符集 校對規(guī)則凑阶。例如,對于德語和法語衷快,utf8_unicode_ci工作的很好宙橱,因此不再需要為這兩種語言創(chuàng)建特殊的utf8校對規(guī)則。
utf8_general_ci也適用與德語和法語蘸拔,除了‘?'等于‘s'师郑,而不是‘ss'之外。如果你的應(yīng)用能夠接受這些调窍,那么應(yīng)該使用utf8_general_ci宝冕,因?yàn)樗俣瓤臁7駝t陨晶,使用utf8_unicode_ci猬仁,因?yàn)樗容^準(zhǔn)確帝璧。
如果你想使用gb2312編碼,那么建議你使用latin1作為數(shù)據(jù)表的默認(rèn)字符集,這樣就能直接用中文在命令行工具中插入數(shù)據(jù),并且可以直接顯示出來.而不要使用gb2312或者gbk等字符集,如果擔(dān)心查詢排序等問題,可以使用binary屬性約束,例如:
代碼如下:create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
二、簡短總結(jié)
utf8_unicode_ci和utf8_general_ci對中湿刽、英文來說沒有實(shí)質(zhì)的差別的烁。
utf8_general_ci校對速度快,但準(zhǔn)確度稍差诈闺。
utf8_unicode_ci準(zhǔn)確度高渴庆,但校對速度稍慢。
如果你的應(yīng)用有德語雅镊、法語或者俄語襟雷,請一定使用utf8_unicode_ci。一般用utf8_general_ci就夠了仁烹,到現(xiàn)在也沒發(fā)現(xiàn)問題耸弄。。卓缰。
三计呈、詳細(xì)總結(jié)
1、對于一種語言僅當(dāng)使用utf8_unicode_ci排序做的不好時(shí)征唬,才執(zhí)行與具體語言相關(guān)的utf8字符集校對規(guī)則捌显。例如,對于德語和法語总寒,utf8_unicode_ci工作的很好扶歪,因此不再需要為這兩種語言創(chuàng)建特殊的utf8校對規(guī)則。
2摄闸、utf8_general_ci也適用與德語和法語善镰,除了‘?'等于‘s',而不是‘ss'之外贪薪。如果你的應(yīng)用能夠接受這些媳禁,那么應(yīng)該使用 utf8_general_ci眠副,因?yàn)樗俣瓤旎小7駝t,使用utf8_unicode_ci囱怕,因?yàn)樗容^準(zhǔn)確霍弹。
用一句話概況上面這段話:utf8_unicode_ci比較準(zhǔn)確,utf8_general_ci速度比較快娃弓。通常情況下 utf8_general_ci的準(zhǔn)確性就夠我們用的了典格,在我看過很多程序源碼后,發(fā)現(xiàn)它們大多數(shù)也用的是utf8_general_ci台丛,所以新建數(shù)據(jù) 庫時(shí)一般選用utf8_general_ci就可以了
四耍缴、如何在MySQL5.0中使用UTF8
在 my.cnf中增加下列參數(shù)
代碼如下:
[mysqld]
init_connect='SET NAMES utf8′
default-character-set=utf8
default-collation = utf8_general_ci
執(zhí)行查詢 mysql> show variables; 相關(guān)如下:
代碼如下:character_set_client | utf8
character_set_connection | utf8
character_set_database | utf8
character_set_results | utf8
character_set_server | utf8
character_set_system | utf8
collation_connection | utf8_general_ci
collation_database | utf8_general_ci
collation_server | utf8_general_ci
個(gè)人見解砾肺,對于數(shù)據(jù)庫的使用,utf8 - general 已經(jīng)足夠的準(zhǔn)確防嗡,并且相較與 utf8 - unicode速度上有優(yōu)勢变汪,固可放心采用之
附1:舊數(shù)據(jù)升級(jí)辦法
以原來的字符集為latin1為例,升級(jí)成為utf8的字符集蚁趁。原來的表: old_table (default charset=latin1)裙盾,新表:new_table(default charset=utf8)。
第一步:導(dǎo)出舊數(shù)據(jù)
復(fù)制代碼 代碼如下:mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql
第二步:轉(zhuǎn)換編碼(類似unix/linux環(huán)境下)
代碼如下:iconv -t utf-8 -f gb2312 -c old.sql > new.sql
或者可以去掉 -f 參數(shù)他嫡,讓iconv自動(dòng)判斷原來的字符集
代碼如下:iconv -t utf-8 -c old.sql > new.sql
在這里番官,假定原來的數(shù)據(jù)默認(rèn)是gb2312編碼。
第三步:導(dǎo)入
修改old.sql钢属,在插入/更新語句開始之前徘熔,增加一條sql語句: "SET NAMES utf8;",保存淆党。
代碼如下:mysql -hlocalhost -uroot my_db < new.sql
大功告成=辍!
附2:支持查看utf8字符集的MySQL客戶端有
1.) MySQL-Front宁否,據(jù)說這個(gè)項(xiàng)目已經(jīng)被MySQL AB勒令停止了窒升,不知為何,如果國內(nèi)還有不少破解版可以下載(不代表我推薦使用破解版 :-P)慕匠。
2.) Navicat饱须,另一款非常不錯(cuò)的MySQL客戶端,漢化版剛出來台谊,還邀請我試用過蓉媳,總的來說還是不錯(cuò)的,不過也需要付費(fèi)锅铅。
3.) PhpMyAdmin酪呻,開源的php項(xiàng)目,非常好盐须。
4.) Linux下的終端工具(Linux terminal)玩荠,把終端的字符集設(shè)置為utf8,連接到MySQL之后贼邓,執(zhí)行 SET NAMES UTF8; 也能讀寫utf8數(shù)據(jù)了阶冈。
轉(zhuǎn):http://www.3lian.com/edu/2014/04-09/140079.html