mysql字符集和校對(duì)規(guī)則(Mysql校對(duì)集)
字符集和校對(duì)規(guī)則
字符集是一套符號(hào)和編碼。校對(duì)規(guī)則是在字符集內(nèi)用于比較字符的一套規(guī)則。
MySql在collation提供較強(qiáng)的支持,oracel在這方面沒查到相應(yīng)的資料。
不同字符集有不同的校對(duì)規(guī)則,命名約定:以其相關(guān)的字符集名開始,通常包括一個(gè)語言名,并且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結(jié)束
校對(duì)規(guī)則一般分為兩類:
binary collation,二元法,直接比較字符的編碼,可以認(rèn)為是區(qū)分大小寫的,因?yàn)樽址?A'和'a'的編碼顯然不同。
字符集_語言名,utf8默認(rèn)校對(duì)規(guī)則是utf8_general_ci
mysql字符集和校對(duì)規(guī)則有4個(gè)級(jí)別的默認(rèn)設(shè)置:服務(wù)器級(jí)、數(shù)據(jù)庫級(jí)、表級(jí)和連接級(jí)。
具體來說,我們系統(tǒng)使用的是utf8字符集,如果使用utf8_bin校對(duì)規(guī)則執(zhí)行sql查詢時(shí)區(qū)分大小寫,使用utf8_general_ci 不區(qū)分大小寫。不要使用utf8_unicode_ci。
如create database demo CHARACTER SET utf8; 默認(rèn)校對(duì)規(guī)則是utf8_general_ci 。
Unicode與UTF8
Unicode只是一個(gè)符號(hào)集,它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ).
UTF8字符集是存儲(chǔ)Unicode數(shù)據(jù)的一種可選方法。mysql同時(shí)支持另一種實(shí)現(xiàn)ucs2。
詳細(xì)說明
字符集(charset):是一套符號(hào)和編碼。
校對(duì)規(guī)則(collation):是在字符集內(nèi)用于比較字符的一套規(guī)則,比如定義'A'<'B'這樣的關(guān)系的規(guī)則。不同collation可以實(shí)現(xiàn)不同的比較規(guī)則,如'A'='a'在有的規(guī)則中成立,而有的不成立;進(jìn)而說,就是有的規(guī)則區(qū)分大小寫,而有的無視。
每個(gè)字符集有一個(gè)或多個(gè)校對(duì)規(guī)則,并且每個(gè)校對(duì)規(guī)則只能屬于一個(gè)字符集。
binary collation,二元法,直接比較字符的編碼,可以認(rèn)為是區(qū)分大小寫的,因?yàn)樽址?A'和'a'的編碼顯然不同。除此以外,還有更加復(fù)雜的比較規(guī)則,這些規(guī)則在簡單的二元法之上增加一些額外的規(guī)定,比較就更加復(fù)雜了。
mysql5.1在字符集和校對(duì)規(guī)則的使用比其它大多數(shù)數(shù)據(jù)庫管理系統(tǒng)超前許多,可以在任何級(jí)別進(jìn)行使用和設(shè)置,為了有效地使用這些功能,你需要了解哪些字符集和 校對(duì)規(guī)則是可用的,怎樣改變默認(rèn)值,以及它們?cè)鯓佑绊懽址僮鞣妥址瘮?shù)的行為。
校對(duì)規(guī)則一般有這些特征:
兩個(gè)不同的字符集不能有相同的校對(duì)規(guī)則。
每個(gè)字符集有一個(gè)默認(rèn)校對(duì)規(guī)則。例如,utf8默認(rèn)校對(duì)規(guī)則是utf8_general_ci。
存在校對(duì)規(guī)則命名約定:它們以其相關(guān)的字符集名開始,通常包括一個(gè)語言名,并且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結(jié)束
確定默認(rèn)字符集和校對(duì)
字符集和校對(duì)規(guī)則有4個(gè)級(jí)別的默認(rèn)設(shè)置:服務(wù)器級(jí)、數(shù)據(jù)庫級(jí)、表級(jí)和連接級(jí)。
數(shù)據(jù)庫字符集和校對(duì)
每一個(gè)數(shù)據(jù)庫有一個(gè)數(shù)據(jù)庫字符集和一個(gè)數(shù)據(jù)庫校對(duì)規(guī)則,它不能夠?yàn)榭?。CREATE DATABASE和ALTER DATABASE語句有一個(gè)可選的子句來指定數(shù)據(jù)庫字符集和校對(duì)規(guī)則:
例如:
CREATE DATABASE db_name DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL這樣選擇數(shù)據(jù)庫字符集和數(shù)據(jù)庫校對(duì)規(guī)則:
· 如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校對(duì)規(guī)則Y。
· 如果指定了CHARACTER SET X而沒有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默認(rèn)校對(duì)規(guī)則。
· 否則,采用服務(wù)器字符集和服務(wù)器校對(duì)規(guī)則。
在SQL語句中使用COLLATE
•使用COLLATE子句,能夠?yàn)橐粋€(gè)比較覆蓋任何默認(rèn)校對(duì)規(guī)則。COLLATE可以用于多種SQL語句中。
使用WHERE:
select * from pro_product where product_code='ABcdefg' collate utf8_general_ci
Unicode與UTF8
Unicode只是一個(gè)符號(hào)集,它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ).Unicode碼可以采用UCS-2格式直接存儲(chǔ).mysql支持ucs2字符集。
UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實(shí)現(xiàn)方式。其他實(shí)現(xiàn)方式還包括UTF-16和UTF-32,不過在互聯(lián)網(wǎng)上基本不用。
UTF8字符集(轉(zhuǎn)換Unicode表示)是存儲(chǔ)Unicode數(shù)據(jù)的一種可選方法。它根據(jù)RFC 3629執(zhí)行。UTF8字符集的思想是不同Unicode字符采用變長字節(jié)序列編碼:
· 基本拉丁字母、數(shù)字和標(biāo)點(diǎn)符號(hào)使用一個(gè)字節(jié)。
· 大多數(shù)的歐洲和中東手寫字母適合兩個(gè)字節(jié)序列:擴(kuò)展的拉丁字母(包括發(fā)音符號(hào)、長音符號(hào)、重音符號(hào)、低音符號(hào)和其它音符)、西里爾字母、希臘語、亞美尼亞語、希伯來語、阿拉伯語、敘利亞語和其它語言。
· 韓語、中文和日本象形文字使用三個(gè)字節(jié)序列
摘自:用夢(mèng)想丈量人生,用奔跑丈量激情
校對(duì)集
MySQL5.5.8中共有字符集39,校對(duì)集195個(gè)
#顯示所有的校對(duì)集
Show collation
#顯示所有的字符集
show character set
所以一個(gè)字符集對(duì)應(yīng)多個(gè)校對(duì)集,即同樣的一個(gè)字符集有多重排序規(guī)則
比如一個(gè)utf8的字符集共有22中排序規(guī)則
Utf8字符集默認(rèn)的校對(duì)集為utf8_general_ci
通過show collation like ‘utf8\_%'
即可查看

注意:
utf8_general_ci 按照普通的字母順序,而且不區(qū)分大小寫(比如:a B c D)
utf8_bin 按照二進(jìn)制排序(比如:A排在a前面,B D a c)
相關(guān)文章
mysql+Spring數(shù)據(jù)庫隔離級(jí)別與性能分析
數(shù)據(jù)庫隔離級(jí)別與Spring配置事務(wù)的聯(lián)系及性能影響,以下是個(gè)人理解,如果有瑕疵請(qǐng)及時(shí)指正2014-05-05
mysql表字段含關(guān)鍵字執(zhí)行sql報(bào)錯(cuò)的解決方案
在使用MyBatisPlus和MySQL時(shí),遇到SQL查詢錯(cuò)誤,嘗試使用反引號(hào)括起關(guān)鍵字字段和在實(shí)體類屬性上使用反引號(hào)注解都不奏效,后來發(fā)現(xiàn),使用MyBatisPlus增強(qiáng)語法拼寫的SQL時(shí),不會(huì)使用到XML中的語句,因此需要修改實(shí)體類上引用的字段名2026-02-02
MySql如何查看索引并實(shí)現(xiàn)優(yōu)化
這篇文章主要介紹了MySql如何查看索引并實(shí)現(xiàn)優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
MySql如何按照日期進(jìn)行分組統(tǒng)計(jì)
這篇文章主要介紹了MySql如何按照日期進(jìn)行分組統(tǒng)計(jì)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
MYSQL主庫切換binlog模式后主從同步錯(cuò)誤的解決方案
在使用FlinkSQL的mysql-cdc連接器來監(jiān)聽MySQL數(shù)據(jù)庫時(shí),通常需要將MySQL的binlog模式設(shè)置為ROW模式,當(dāng)我們將MySQL主庫的binlog模式從STATEMENT切換為ROW并重啟MySQL服務(wù)后,MySQL從庫在同步時(shí)可能會(huì)報(bào)錯(cuò),所以本文介紹了MYSQL主庫切換binlog模式后主從同步錯(cuò)誤的解決方案2024-08-08
MySQL使用正則表達(dá)式進(jìn)行查詢操作經(jīng)典實(shí)例總結(jié)
這篇文章主要介紹了MySQL使用正則表達(dá)式進(jìn)行查詢操作,結(jié)合實(shí)例形式總結(jié)分析了各種常見匹配模式的查詢操作實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06

