全文內(nèi)容概述
- 字符集是什么啦鸣?有哪些常見的字符集盈简?字符集的發(fā)展和歷史知識
- Unicode字符集的由來和特點
- MYSQL數(shù)據(jù)庫中的字符集碑诉、字符集排序規(guī)則、編碼方式
- 與數(shù)據(jù)庫中字符相關(guān)的問題
概念篇
什么是字符集(Characters Set)
我先說一下我看了這么多字符集相關(guān)的知識和內(nèi)容纳令,之后的一個結(jié)論挽荠。字符集歸根到底其實就是一個很簡單的哈希表映射克胳,追根溯源就是和我們平時工作中開發(fā)最常見的一個東西。哈希表圈匆,它實際上就是映射一個我們看到的字符和一個數(shù)字碼值的映射集合漠另。字符集告訴了計算器,什么是"1","你","&"臭脓,然后顯示器將它映射成這些我們看到的內(nèi)容并展示給大家酗钞。
原來我們天天接觸的字符集,我們看到的語言就是很簡單的一個數(shù)據(jù)結(jié)構(gòu)嘛来累。哈希表砚作,一一映射。沒什么難懂的嘹锁,當(dāng)我知道了它底層的存儲結(jié)構(gòu)之后葫录,就再也不慌啦。
摘自百度百科
字符(Character)是各種文字和符號的總稱领猾,包括各國家文字米同、標(biāo)點符號、圖形符號摔竿、數(shù)字等面粮。字符集(Character set)是多個字符的集合,字符集種類較多继低,每個字符集包含的字符個數(shù)不同熬苍,常見字符集名稱:ASCII字符集、GB2312字符集袁翁、BIG5字符集柴底、 GB18030字符集、Unicode字符集等粱胜。計算機要準(zhǔn)確的處理各種字符集文字柄驻,就需要進行字符編碼,以便計算機能夠識別和存儲各種文字焙压。中文文字?jǐn)?shù)目大鸿脓,而且還分為簡體中文和繁體中文兩種不同書寫規(guī)則的文字,而計算機最初是按英語單字節(jié)字符設(shè)計的冗恨,因此答憔,對中文字符進行編碼,是中文信息交流的技術(shù)基礎(chǔ)掀抹。
常見的字符集有哪些
- ASCII
ASCII(American Standard Code for Information Interchange,美國信息互換標(biāo)準(zhǔn)編碼)是基于羅馬字母表的一套電腦編碼系統(tǒng)心俗。它主要用于顯示現(xiàn)代英語和其他西歐語言傲武。它是最通用的單字節(jié)編碼系統(tǒng)蓉驹,并等同于國際標(biāo)準(zhǔn)ISO 646。控制字符:回車鍵揪利、退格态兴、換行鍵等∨蔽唬可顯示字符:英文大小寫字符瞻润、阿拉伯?dāng)?shù)字和西文符號。7位編碼的字符集只能支持128個字符甜刻,為了表示更多的歐洲常用字符對ASCII進行了擴展绍撞,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符得院。ASCII擴展字符集:它是從ASCII字符集擴充出來的傻铣,擴充后的符號增加了表格符號、計算符號祥绞、希臘字母和特殊的拉丁符號非洲。
特點
7位(bits)表示一個字符,共128字符蜕径,字符值從0到127两踏,其中32到126是可打印字符。
存儲大卸涤鳌:單字節(jié)的字符集
- GB2312
GB2312又稱為GB2312-80字符集梦染,全稱為《信息交換用漢字編碼字符集·基本集》,由原中國國家標(biāo)準(zhǔn)總局發(fā)布虹统,1981年5月1日實施弓坞。
GB2312是中國國家標(biāo)準(zhǔn)的簡體中文字符集。它所收錄的漢字已經(jīng)覆蓋99.75%的使用頻率车荔,基本滿足了漢字的計算機處理需要渡冻。在中國大陸和新加坡獲廣泛使用。
GB2312收錄簡化漢字及一般符號忧便、序號族吻、數(shù)字、拉丁字母珠增、日文假名超歌、希臘字母、俄文字母蒂教、漢語拼音符號巍举、漢語注音字母,共 7445 個圖形字符凝垛。其中包括6763個漢字懊悯,其中一級漢字3755個蜓谋,二級漢字3008個;包括拉丁字母炭分、希臘字母桃焕、日文平假名及片假名字母、俄語西里爾字母在內(nèi)的682個全角字符捧毛。
特點
GB2312中對所收漢字進行了“分區(qū)”處理观堂,每區(qū)含有94個漢字/符號。這種表示方式也稱為區(qū)位碼呀忧。
各區(qū)包含的字符如下:01-09區(qū)為特殊符號师痕;16-55區(qū)為一級漢字,按拼音排序荐虐;56-87區(qū)為二級漢字七兜,按部首/筆畫排序;10-15區(qū)及88-94區(qū)則未有編碼福扬。
雙字節(jié)表示
兩個字節(jié)中前面的字節(jié)為第一字節(jié)腕铸,后面的字節(jié)為第二字節(jié)。習(xí)慣上稱第一字節(jié)為“高字節(jié)” 铛碑,而稱第二字節(jié)為“低字節(jié)”狠裹。
“高位字節(jié)”使用了0xA1-0xF7(把01-87區(qū)的區(qū)號加上0xA0),“低位字節(jié)”使用了0xA1-0xFE(把01-94加上0xA0)汽烦。
編碼舉例
以GB2312字符集的第一個漢字“啊”字為例涛菠,它的區(qū)號16,位號01撇吞,則區(qū)位碼是1601俗冻,在大多數(shù)計算機程序中,高字節(jié)和低字節(jié)分別加0xA0得到程序的字處理編碼0xB0A1牍颈。計算公式是:0xB0=0xA0+16, 0xA1=0xA0+1迄薄。
- BIG5
又稱大五碼或五大碼,1984年由臺灣財團法人信息工業(yè)策進會和五家軟件公司宏碁 (Acer)煮岁、神通 (MiTAC)讥蔽、佳佳、零壹 (Zero One)画机、大眾 (FIC)創(chuàng)立冶伞,故稱大五碼。
Big5碼的產(chǎn)生步氏,是因為當(dāng)時臺灣不同廠商各自推出不同的編碼响禽,如倚天碼、IBM PS55、王安碼等金抡,彼此不能兼容瀑焦;另一方面腌且,臺灣政府當(dāng)時尚未推出官方的漢字編碼梗肝,而中國大陸的GB2312編碼亦未有收錄繁體中文字。
Big5字符集共收錄13,053個中文字铺董,該字符集在中國臺灣使用巫击。耐人尋味的是該字符集重復(fù)地收錄了兩個相同的字:“兀”(0xA461及0xC94A)精续、“嗀”(0xDCD1及0xDDFC)坝锰。
特點
Big5碼使用了雙字節(jié)儲存方法,以兩個字節(jié)來編碼一個字重付。第一個字節(jié)稱為“高位字節(jié)”顷级,第二個字節(jié)稱為“低位字節(jié)”。高位字節(jié)的編碼范圍0xA1-0xF9确垫,低位字節(jié)的編碼范圍0x40-0x7E及0xA1-0xFE弓颈。
各編碼范圍對應(yīng)的字符類型如下:0xA140-0xA3BF為標(biāo)點符號、希臘字母及特殊符號删掀,另外于0xA259-0xA261翔冀,存放了雙音節(jié)度量衡單位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E為常用漢字披泪,先按筆劃再按部首排序纤子;0xC940-0xF9D5為次常用漢字,亦是先按筆劃再按部首排序款票。
局限性
盡管Big5碼內(nèi)包含一萬多個字符控硼,但是沒有考慮社會上流通的人名、地名用字艾少、方言用字卡乾、化學(xué)及生物科等用字,沒有包含日文平假名及片假名字母姆钉。例如臺灣視“著”為“著”的異體字说订,故沒有收錄“著”字潮瓶√焊ǎ康熙字典中的一些部首用字(如“亠”埂伦、“疒”思恐、“辵”膊毁、“癶”等)、常見的人名用字(如“堃”基跑、“煊”、“栢”栅螟、“喆”等) 也沒有收錄到Big5之中
- GB18030
GB18030的全稱是GB18030-2000《信息交換用漢字編碼字符集基本集的擴充》力图,是我國政府于2000年3月17日發(fā)布的漢字編碼國家標(biāo)準(zhǔn)掺逼,2001年8月31日后在中國市場上發(fā)布的軟件必須符合本標(biāo)準(zhǔn)吕喘。GB 18030字符集標(biāo)準(zhǔn)的出臺經(jīng)過廣泛參與和論證兽泄,來自國內(nèi)外知名信息技術(shù)行業(yè)的公司,信息產(chǎn)業(yè)部和原國家質(zhì)量技術(shù)監(jiān)督局聯(lián)合實施胃珍。
GB 18030字符集標(biāo)準(zhǔn)解決漢字觅彰、日文假名填抬、朝鮮語和中國少數(shù)民族文字組成的大字符集計算機編碼問題隧期。該標(biāo)準(zhǔn)的字符總編碼空間超過150萬個編碼位仆潮,收錄了27484個漢字性置,覆蓋中文、日文屏歹、朝鮮語和中國少數(shù)民族文字蝙眶。滿足中國大陸械馆、香港、臺灣冶忱、日本和韓國等東亞地區(qū)信息交換多文種境析、大字量劳淆、多用途沛鸵、統(tǒng)一編碼格式的要求曲掰。并且與Unicode 3.0版本兼容栏妖,填補Unicode擴展字符字匯“統(tǒng)一漢字?jǐn)U展A”的內(nèi)容吊趾。并且與以前的國家字符編碼標(biāo)準(zhǔn)(GB2312论泛,GB13000.1)兼容孵奶。
特點
GB 18030標(biāo)準(zhǔn)采用單字節(jié)、雙字節(jié)和四字節(jié)三種方式對字符編碼湿颅。單字節(jié)部分使用0×00至0×7F碼(對應(yīng)于ASCII碼的相應(yīng)碼)油航。雙字節(jié)部分谊囚,首字節(jié)碼從0×81至0×FE镰踏,尾字節(jié)碼位分別是0×40至0×7E和0×80至0×FE奠伪。四字節(jié)部分采用GB/T 11383未采用的0×30到0×39作為對雙字節(jié)編碼擴充的后綴绊率,這樣擴充的四字節(jié)編碼滤否,其范圍為0×81308130到0×FE39FE39藐俺。其中第一紊搪、三個字節(jié)編碼碼位均為0×81至0×FE耀石,第二滞伟、四個字節(jié)編碼碼位均為0×30至0×39梆奈。
雙字節(jié)部分收錄內(nèi)容主要包括GB13000.1全部CJK漢字20902個亩钟、有關(guān)標(biāo)點符號清酥、表意文字描述符13個焰轻、增補的漢字和部首/構(gòu)件80個辱志、雙字節(jié)編碼的歐元符號等揩懒⌒翊樱 四字節(jié)部分收錄了上述雙字節(jié)字符之外的和悦,包括CJK統(tǒng)一漢字?jǐn)U充A在內(nèi)的GB 13000.1中的全部字符鸽素。
- Unicode
千呼萬喚始出來,終于和我們的大BOSS鳍悠,也是我們基本上不管少數(shù)特殊情況都一定會使用和遇見的Unicode字符集。
Unicode字符集從1990年代誕生以來就一直在不斷地更新和擴充瓦呼,一開始是16個比特的標(biāo)識空間央串。從Unicode2.0開始就轉(zhuǎn)變成可以表示U+0000~U+10FFFF的21個比特標(biāo)識空間的字符集质和。到目前最新的版本是13.0饲宿。
Version 13.0 (2020)
Code Point Type | Count | Delta |
---|---|---|
Total Designated | 283,506 | 5,930 |
Reserved Code Points | 830,606 | -5,930 |
最新的版本已經(jīng)標(biāo)識了28萬多個字符仗阅,還有83萬個碼值可以繼續(xù)使用霹菊。
Characters Before Unicode
Fundamentally, computers just deal with numbers. They store letters and other characters by assigning a number for each one. Before Unicode was invented, there were hundreds of different systems, called character encodings, for assigning these numbers. These early character encodings were limited and could not contain enough characters to cover all the world's languages. Even for a single language like English no single encoding was adequate for all the letters, punctuation, and technical symbols in common use.
Early character encodings also conflicted with one another. That is, two encodings could use the same number for two different characters, or use different numbers for the same character. Any given computer (especially servers) would need to support many different encodings. However, when data is passed through different computers or between different encodings, that data runs the risk of corruption.
我們都知道旋廷,計算機只會處理數(shù)字饶碘。在沒有Unicode字符集之前扎运,各個國家和系統(tǒng)之間都有自己的定義的字符集還有編碼規(guī)則豪治,這導(dǎo)致出現(xiàn)了一些問題负拟,比如有的字符集表示的空間不夠掩浙,不能很好的囊括足夠的字符。每一個電腦為了能夠很好的展示和表達(dá)這些字符谬墙,需要支持很多不同的編碼方式芭梯,當(dāng)數(shù)據(jù)在兩種不同的字符編碼規(guī)則之間進行存儲和傳輸?shù)臅r候玖喘,數(shù)據(jù)沖突的風(fēng)險大大的提高了累奈。
有了Unicode字符集之后澎媒,一切都變的更加統(tǒng)一和規(guī)范了戒努。
它為全世界的語言储玫、字符和各種符號提供了唯一的碼值匣椰,無論你是什么平臺禽笑、什么國家佳镜、什么系統(tǒng)邀杏。它可以適應(yīng)目前現(xiàn)代的所有數(shù)據(jù)存儲和傳輸,并且不發(fā)生數(shù)據(jù)沖突拷恨。也支持WWW互聯(lián)網(wǎng)的字符和元素,使用了Unicode字符集就可以不用再去考慮太多的關(guān)于字符沖突冕杠、數(shù)據(jù)存儲分预、數(shù)據(jù)傳輸?shù)葐栴}笼痹。想表達(dá)的字符凳干,這里都有涧团。而且大部分的交互平臺和系統(tǒng)也支持Unicode字符集泌绣。算是為計算機和人類語言的溝通做出了很大的貢獻(xiàn)赞别。
最后用一個表格總結(jié)一下仿滔,上面常見字符集的特點對比。
概念 | 表示空間大小 | 編碼規(guī)則 | 局限性 | 推薦指數(shù) | |
---|---|---|---|---|---|
ASCII | 單字節(jié) | 只能支持128個字符 | 四星 | ||
GB2312 | 雙字節(jié) | 支持的中文漢字還不夠全面飒焦,同時不能很好的處理和東南亞周邊國家的數(shù)據(jù)兼容 | 三星 | ||
BIG5 | 雙字節(jié) | 有部分漢字沒有收錄牺荠,同時會有歧義字 | 三星 | ||
GB18030 | 字節(jié)、雙字節(jié)和四字節(jié)三種方式 | 主要支持的是東南亞國家和地區(qū)語言杈曲,對全球的語言兼容性還有欠缺 | 四星 | ||
Unicode | 21 bits | UTF8担扑,UTF16涌献,UTF32洁奈,UCS2等 | 無 | 五星 |
無腦用Unicode就好了
MYSQL數(shù)據(jù)庫中的字符集呈野、字符集排序規(guī)則
MYSQL中的字符集
MySQL字符集總覽
MySQL中支持的字符集被冒,可以通過一下命令去查看。
mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
...
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
...
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
...
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
...
| binary | Binary pseudo charset | binary | 1 |
...
這里特別要注意的一點就是utf8字符集率触,因為MySQL自身的緣故。utf8實際上是只有最大三個字節(jié)表示的字符集两曼,也叫做utf8mb3悼凑。它和國際標(biāo)準(zhǔn)的utf8不一樣户辫。所以這也是為什么,數(shù)據(jù)庫實踐中要使用utf8mb4的緣故,就是為了支持除了BMP以外的更多拓展字符酷誓。
字符集轉(zhuǎn)換
MySQL和字符相關(guān)的數(shù)據(jù)類型有兩種,一種是二進制字符串類型(Binary data type) 另一種是非二進制字符串類型(NonBinary data type)玫氢。
使用binary data type 一定要記得只能存儲一種字符集的二進制編碼漾峡。不要存儲多種生逸。否則MySQL無法正確的進行數(shù)據(jù)轉(zhuǎn)換
轉(zhuǎn)換規(guī)則:
- 如果是二進制字符串類型烙无,可以直接轉(zhuǎn)成對應(yīng)非二進制字符串類型截酷。比如一個VARBINARY 列存儲了utf8mb4的二進制字符串,直接使用alter 語句進行轉(zhuǎn)換灾部。
ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET utf8mb4;
就可以正常轉(zhuǎn)換了赌髓。
- 如果是兩個二進制字符串進行轉(zhuǎn)換锁蠕,那些不存在于兩個字符集中的數(shù)據(jù)可能出現(xiàn)數(shù)據(jù)丟失的情況。這里我舉一個可以正常轉(zhuǎn)換的例子和一個不能正常轉(zhuǎn)換的例子懊蒸。
請看下面的語句執(zhí)行:
#創(chuàng)建一個big5的字符集的表
CREATE TABLE `table_with_big5` (
`column1` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=big5
#往里面插入一點數(shù)據(jù)
INSERT into table_with_big5 values('你好');
#1.查看此時的數(shù)據(jù)和對應(yīng)的底層存儲數(shù)據(jù)
SELECT column1,HEX(column1) from table_with_big5;
#2.這個時候我們做一下字符集轉(zhuǎn)換
ALTER table table_with_big5 CONVERT to CHARSET utf8mb4;
#3.然后我們再看一下數(shù)據(jù)和對應(yīng)的底層存儲數(shù)據(jù)
SELECT column1,HEX(column1) from table_with_big5;
#4.這個時候我們插入一個表情荣倾,這個是utf8mb4才支持,而big5并不支持的字符
INSERT into table_with_big5 values('??');
#5.再次轉(zhuǎn)換字符集變回big5
ALTER table table_with_big5 CONVERT to CHARSET big5;
1處的查詢結(jié)果如下骑丸,正常的顯示big5的數(shù)據(jù)和二進制數(shù)據(jù)舌仍。
2處的查詢結(jié)果如下通危,底層的二進制數(shù)據(jù)已經(jīng)發(fā)生了變化铸豁。變成了utf8mb4的編碼規(guī)則了。并且也正常的顯示了中文"你好"
因為"你好"這個中文字符在兩個字符集都存在菊碟,所以可以正常轉(zhuǎn)換节芥。轉(zhuǎn)換的過程應(yīng)該是big5字符集的"你好"->在utf8mb4的字符集中去查找對應(yīng)的中文字符->然后映射到utf8mb4的字符集碼值->按照編碼規(guī)則編碼后存儲回數(shù)據(jù)庫。
5處的轉(zhuǎn)換結(jié)果,發(fā)生了報錯头镊。表情符合在big5中并不存在蚣驼。所以發(fā)生了轉(zhuǎn)換異常。
在官方手冊中也不推薦直接轉(zhuǎn)成整個表的字符集相艇,因為這個可能發(fā)生因字符集不同所需的存儲空間不同颖杏,導(dǎo)致存儲數(shù)據(jù)丟失或者無法轉(zhuǎn)換的情況。比如一個varchar(100)的數(shù)據(jù)類型是可以存儲100個字符的厂捞,如果從Latin字符集轉(zhuǎn)成utf8字符集输玷,latin是一個字符一個字節(jié)。而utf8的一個字符由1-3個字節(jié)組成靡馁。那么100個字節(jié)的latin字符集可以存儲100個字符欲鹏,在utf8這里最多就只能存儲30多個字符了。數(shù)據(jù)信息縮小了不少臭墨。
一種方法是先將數(shù)據(jù)類型轉(zhuǎn)大赔嚎,然后再換個字符集。
MYSQL中的字符集排序規(guī)則(Character set Collations)
collation就是MySQL數(shù)據(jù)庫中數(shù)據(jù)進行比較和排序的規(guī)則依據(jù)胧弛,當(dāng)你要對兩個字符串?dāng)?shù)據(jù)進行比較的時候尤误。用的就是collation的規(guī)則,<u>它和數(shù)據(jù)本身無關(guān)结缚。數(shù)據(jù)本身的存儲只和字符集以及編碼規(guī)則有關(guān)</u>损晤,所以當(dāng)你再面對是否collation的改變是否會對數(shù)據(jù)產(chǎn)生影響的時候,你可以很確認(rèn)的告訴自己红竭。沒影響尤勋!
collation的命名規(guī)則是:字符集______規(guī)則______類型
第一部分是字符集,代表的是這個排序規(guī)則是在什么字符集下的排序茵宪。比如常見的有最冰,utf8mb3(以后在下文中,關(guān)于MYSQL場景下談到的utf8就是等價于utf8mb3而不是國際標(biāo)準(zhǔn)Unicode的utf8稀火,這個后面會有解釋),utf8mb4,ascii等
第二部分是具體規(guī)則暖哨,代表的是不同語言和國家自己定義的排序規(guī)則的標(biāo)準(zhǔn)。比如有Unicode凰狞、general篇裁、unicode_520、swedish
第三部分是類型赡若,目前有如下表格的排序類型
Suffix | Meaning |
---|---|
_ai |
Accent-insensitive |
_as |
Accent-sensitive |
_ci |
Case-insensitive |
_cs |
Case-sensitive |
_bin |
Binary |
通過英文釋義都很好理解茴恰,就是是否對大小寫敏感、對聲調(diào)敏感等斩熊。
綜合起來就是我們在實際MySQL數(shù)據(jù)庫中可以看到的,latin1_swedish_ci伐庭、latin1_german1_ci粉渠、utf8mb4_unicode_ci分冈、utf8mb4_general_ci等collation值了。
一個字符集可能有多個排序規(guī)則collation霸株,而每一個collation對應(yīng)唯一一個字符集雕沉。即為它命名規(guī)則的第一部分。
特性
就是不同的字符集是不能有同樣的排序規(guī)則的
每一個字符集有一個默認(rèn)的排序規(guī)則去件,可以通過查詢特定的語句獲得MYSQL的配置說明
每一個字符集會有多種排序規(guī)則坡椒,為了選擇合適的排序規(guī)則∮攘铮可以先對自己的應(yīng)用數(shù)據(jù)做基準(zhǔn)實驗測試來得到你想要的結(jié)果
collation在數(shù)據(jù)庫中的表現(xiàn)
上面講了很多概念倔叼,下面我們直接在數(shù)據(jù)庫中進行實際操作,來看看collation的影響表現(xiàn)是怎么樣的宫莱。
1.首先創(chuàng)建一個latin1_general_cs的表丈攒,并往里面插入幾條數(shù)據(jù)
CREATE TABLE table_with_cs_collation(
id BIGINT UNSIGNED not null auto_increment COMMENT 'id',
column_1 VARCHAR(100) not null DEFAULT '' COMMENT 'column 1',
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs COMMENT='latin1_general_cs table';
INSERT into table_with_cs_collation(column_1) VALUES('ab');
INSERT into table_with_cs_collation(column_1) VALUES('aB');
INSERT into table_with_cs_collation(column_1) VALUES('Ab');
INSERT into table_with_cs_collation(column_1) VALUES('AB');
排序語句操作
SELECT * from table_with_cs_collation ORDER BY column_1 ASC
結(jié)果如下
查詢語句操作
SELECT * from table_with_cs_collation WHERE column_1 like '%A%'
結(jié)果如下
2.創(chuàng)建一個latin1_general_ci的表,并往里面插入幾條數(shù)據(jù)
CREATE TABLE table_with_latin1_general_ci(
id BIGINT UNSIGNED not null auto_increment COMMENT 'id',
column_1 VARCHAR(100) not null DEFAULT '' COMMENT 'column 1',
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='latin1_general_ci table';
INSERT into table_with_latin1_general_ci(column_1) VALUES('ab');
INSERT into table_with_latin1_general_ci(column_1) VALUES('aB');
INSERT into table_with_latin1_general_ci(column_1) VALUES('Ab');
INSERT into table_with_latin1_general_ci(column_1) VALUES('AB');
排序語句操作
SELECT * from table_with_latin1_general_ci ORDER BY column_1 ASC
結(jié)果如下
查詢語句
SELECT * from table_with_latin1_general_ci WHERE column_1 like '%A%'
結(jié)果如下
從實踐的結(jié)果我們可以看出授霸,ci和cs的區(qū)別巡验,在排序上。cs區(qū)分大小寫碘耳,嚴(yán)格的按照了ASCII的字符集的符號的code point順序返回結(jié)果显设。ci則把a排在了前面。并沒有按照字符集的code point順序辛辨。
在查詢語句的結(jié)果也可以看到捕捂,區(qū)分大小寫的cs在查詢A的時候沒有返回a的結(jié)果,在不區(qū)分大小寫的ci上則返回了愉阎。
The binary Collation Compared to _bin Collations
前面我們討論的都是非二進制字符串的collation绞蹦,二進制數(shù)據(jù)類型其實不在我常用的數(shù)據(jù)類型范圍內(nèi)。一般情況下榜旦,我們使用的都是非二進制的字符串類型幽七。比如varchar char text等數(shù)據(jù)類型。
二進制字符串和非二進制字符串的比較的區(qū)別主要體現(xiàn)在以下幾個方面
- 比較的基本單元
- 字符集轉(zhuǎn)換
- 字母大小寫轉(zhuǎn)換
- comparison時對待末尾空格的處理
- 插入和查詢時對待末尾空格的處理
具體的區(qū)別可以直接查看官網(wǎng)的手冊溅呢,這里就不再過多描述了澡屡。The binary Collation Compared to _bin Collations
常見問題解答
為什么MYSQL數(shù)據(jù)庫千萬不用要utf8字符集?
答:因為MySQL中utf8字符集 是utf8mb3的字符集咐旧,它和國際Unicode標(biāo)準(zhǔn)字符集不太一樣驶鹉。它最大使用了3個字節(jié)去表示字符。國際標(biāo)準(zhǔn)的UTF-8使用最大四個字節(jié)去表示表示字符铣墨。所以我們經(jīng)常會遇到類似于表情??之類的字符無法存儲報錯的情況室埋。這種情況就是使用utf8字符集導(dǎo)致的。所以推薦是使用utf8mb4,可以保持和國際UTF-8一樣的表示范圍。
Binary data type 和Nonbinary data type 在存儲上有區(qū)別嗎姚淆?
兩者在底層都是二進制字節(jié)存儲孕蝉,從本質(zhì)上來講并無差異。但是Nonbinary數(shù)據(jù)類型時會帶上字符集的信息腌逢,也就是說它的二進制字節(jié)是符合它定義的字符集的規(guī)律的降淮。可以被此字符集通過規(guī)則進行解碼并表現(xiàn)出對應(yīng)字符搏讶。而binary數(shù)據(jù)類型則比較存粹就是二進制字節(jié)佳鳖。