Mysql中的排序規(guī)則utf8_unicode_ci、utf8_general_ci的區(qū)別總結(jié)
用了這么長(zhǎng)時(shí)間,發(fā)現(xiàn)自己竟然不知道utf_bin和utf_general_ci這兩者到底有什么區(qū)別。。
ci是 case insensitive, 即 "大小寫不敏感", a 和 A 會(huì)在字符判斷中會(huì)被當(dāng)做一樣的;
bin 是二進(jìn)制, a 和 A 會(huì)別區(qū)別對(duì)待.
例如你運(yùn)行:
SELECT * FROM table WHERE txt = 'a'
那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 則可以.
utf8_general_ci 不區(qū)分大小寫,這個(gè)你在注冊(cè)用戶名和郵箱的時(shí)候就要使用。
utf8_general_cs 區(qū)分大小寫,如果用戶名和郵箱用這個(gè) 就會(huì)照成不良后果
utf8_bin:字符串每個(gè)字符串用二進(jìn)制數(shù)據(jù)編譯存儲(chǔ)。 區(qū)分大小寫,而且可以存二進(jìn)制的內(nèi)容
一、官方文檔說明
下面摘錄一下Mysql 5.1中文手冊(cè)中關(guān)于utf8_unicode_ci與utf8_general_ci的說明:
當(dāng)前,utf8_unicode_ci校對(duì)規(guī)則僅部分支持Unicode校對(duì)規(guī)則算法。一些字符還是不能支持。并且,不能完全支持組合的記號(hào)。這主要影響越南和俄羅斯的一些少數(shù)民族語言,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支持?jǐn)U展,即當(dāng)把一個(gè)字母看作與其它字母組合相等時(shí)。例如,在德語和一些其它語言中‘ß'等于‘ss'。
utf8_general_ci是一個(gè)遺留的 校對(duì)規(guī)則,不支持?jǐn)U展。它僅能夠在字符之間進(jìn)行逐個(gè)比較。這意味著utf8_general_ci校對(duì)規(guī)則進(jìn)行的比較速度很快,但是與使用utf8_unicode_ci的 校對(duì)規(guī)則相比,比較正確性較差)。
例如,使用utf8_general_ci和utf8_unicode_ci兩種 校對(duì)規(guī)則下面的比較相等:
Ä = A
Ö = O
Ü = U
兩種校對(duì)規(guī)則之間的區(qū)別是,對(duì)于utf8_general_ci下面的等式成立:
ß = s
但是,對(duì)于utf8_unicode_ci下面等式成立:
ß = ss
對(duì)于一種語言僅當(dāng)使用utf8_unicode_ci排序做的不好時(shí),才執(zhí)行與具體語言相關(guān)的utf8字符集 校對(duì)規(guī)則。例如,對(duì)于德語和法語,utf8_unicode_ci工作的很好,因此不再需要為這兩種語言創(chuàng)建特殊的utf8校對(duì)規(guī)則。
utf8_general_ci也適用與德語和法語,除了‘ß'等于‘s',而不是‘ss'之外。如果你的應(yīng)用能夠接受這些,那么應(yīng)該使用utf8_general_ci,因?yàn)樗俣瓤?。否則,使用utf8_unicode_ci,因?yàn)樗容^準(zhǔn)確。
如果你想使用gb2312編碼,那么建議你使用latin1作為數(shù)據(jù)表的默認(rèn)字符集,這樣就能直接用中文在命令行工具中插入數(shù)據(jù),并且可以直接顯示出來.而不要使用gb2312或者gbk等字符集,如果擔(dān)心查詢排序等問題,可以使用binary屬性約束,例如:
二、簡(jiǎn)短總結(jié)
utf8_unicode_ci和utf8_general_ci對(duì)中、英文來說沒有實(shí)質(zhì)的差別。
utf8_general_ci校對(duì)速度快,但準(zhǔn)確度稍差。
utf8_unicode_ci準(zhǔn)確度高,但校對(duì)速度稍慢。
如果你的應(yīng)用有德語、法語或者俄語,請(qǐng)一定使用utf8_unicode_ci。一般用utf8_general_ci就夠了,到現(xiàn)在也沒發(fā)現(xiàn)問題。。。
三、詳細(xì)總結(jié)
1、對(duì)于一種語言僅當(dāng)使用utf8_unicode_ci排序做的不好時(shí),才執(zhí)行與具體語言相關(guān)的utf8字符集校對(duì)規(guī)則。例如,對(duì)于德語和法語,utf8_unicode_ci工作的很好,因此不再需要為這兩種語言創(chuàng)建特殊的utf8校對(duì)規(guī)則。
2、utf8_general_ci也適用與德語和法語,除了‘?'等于‘s',而不是‘ss'之外。如果你的應(yīng)用能夠接受這些,那么應(yīng)該使用 utf8_general_ci,因?yàn)樗俣瓤?。否則,使用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_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è)人見解,對(duì)于數(shù)據(jù)庫的使用,utf8 - general 已經(jīng)足夠的準(zhǔn)確,并且相較與 utf8 - unicode速度上有優(yōu)勢(shì),固可放心采用之
附1:舊數(shù)據(jù)升級(jí)辦法
以原來的字符集為latin1為例,升級(jí)成為utf8的字符集。原來的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。
第一步:導(dǎo)出舊數(shù)據(jù)
第二步:轉(zhuǎn)換編碼(類似unix/linux環(huán)境下)
或者可以去掉 -f 參數(shù),讓iconv自動(dòng)判斷原來的字符集
在這里,假定原來的數(shù)據(jù)默認(rèn)是gb2312編碼。
第三步:導(dǎo)入
修改old.sql,在插入/更新語句開始之前,增加一條sql語句: "SET NAMES utf8;",保存。
大功告成?。?/p>
附2:支持查看utf8字符集的MySQL客戶端有
1.) MySQL-Front,據(jù)說這個(gè)項(xiàng)目已經(jīng)被MySQL AB勒令停止了,不知為何,如果國(guó)內(nèi)還有不少破解版可以下載(不代表我推薦使用破解版 :-P)。
2.) Navicat,另一款非常不錯(cuò)的MySQL客戶端,漢化版剛出來,還邀請(qǐng)我試用過,總的來說還是不錯(cuò)的,不過也需要付費(fèi)。
3.) PhpMyAdmin,開源的php項(xiàng)目,非常好。
4.) Linux下的終端工具(Linux terminal),把終端的字符集設(shè)置為utf8,連接到MySQL之后,執(zhí)行 SET NAMES UTF8; 也能讀寫utf8數(shù)據(jù)了。
相關(guān)文章
解決windows service 2012阿里云服務(wù)器在搭建mysql時(shí)缺少msvcr100.dll文件的問題
這篇文章主要介紹了解決windows service 2012阿里云服務(wù)器在搭建mysql時(shí)缺少msvcr100.dll文件的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02MySQL?RC事務(wù)隔離的實(shí)現(xiàn)原理
這篇文章主要介紹了MySQL?RC事務(wù)隔離的實(shí)現(xiàn),Read?Committed,事務(wù)運(yùn)行期間,只要?jiǎng)e的事務(wù)修改數(shù)據(jù)并提交,即可讀到人家修改的數(shù)據(jù),所以會(huì)有不可重復(fù)讀、幻讀問題,下文相關(guān)介紹需要的朋友可以參考下2022-03-03MySQL 索引和數(shù)據(jù)表該如何維護(hù)
使用合適的數(shù)據(jù)類型完成數(shù)據(jù)表創(chuàng)建和建立索引后,工作并沒有完結(jié)——你需要去維護(hù)數(shù)據(jù)表和索引以保證它們運(yùn)行良好。數(shù)據(jù)表維護(hù)的主要目的是查找和修復(fù)沖突,維護(hù)精確的索引統(tǒng)計(jì)和減少碎片。2021-05-05idea連接mysql數(shù)據(jù)庫失敗的幾種解決方案
我們?cè)趯W(xué)習(xí)Mybatis時(shí)需要連接Mysql數(shù)據(jù)庫,使用IDEA無法連接mysql數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于idea連接mysql數(shù)據(jù)庫失敗的幾種解決方案,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06MySQL數(shù)據(jù)庫導(dǎo)入導(dǎo)出數(shù)據(jù)之報(bào)錯(cuò)解答實(shí)例講解
這篇文章主要介紹了MySQL數(shù)據(jù)庫導(dǎo)入導(dǎo)出數(shù)據(jù)之報(bào)錯(cuò)解答實(shí)例講解,文中對(duì)報(bào)錯(cuò)和解決方法做了詳細(xì)的實(shí)例展示,有需要的同學(xué)可以借鑒參考下2021-02-02