mysql中的utf8字符集與標準UTF-8的區別

儘管字面上非常相似,但mysql的utf-8的覆蓋範圍僅僅是所有UTF-8字符集的一部分。這非常容易誤導初學者。

UTF-8是UCS字符集的一種編碼方式,可能將一個字符編碼爲1個字節,2個字節,3個字節,或者4個字節。

編碼爲1個字節的字符就是ASCII碼(有時稱爲latin文字符號),包含了拉丁語言中使用的符號,如拉丁字母、數字、標點等。
編碼爲2個字節的字符包括了歐洲和中東地區語言(如希臘語、希伯來語、亞美尼亞語、阿拉伯語、敘利亞語等)中使用的符號。
編碼爲3個字節的字符包括了中文日文韓文等亞洲語言使用的符號。
編碼爲4個字節的字符包括了一些特殊的符號,比如一些表情符號。

日常使用的絕大多數符號,都包括在前三種裏。這三種合起來佔據了unicode編碼空間的第一個平面。unicode一共有17個平面。第一個平面稱爲Basic Multilingual Plane,簡稱爲BMP,一共包含了2^16=65536個編碼。這些編碼裏包括了日常使用的各種可見符號、可見和不可見控制符號、用於UTF-16編碼擴展的特殊符號、一些私有用途符號,以及少數未分配符號。

mysql的utf8字符集就是對應於unicode的BMP平面。它可以用來存儲所有BMP字符。因爲BMP字符在使用UTF-8編碼時最多佔據3個字節,所以mysql在爲char(n)數據類型分配存儲空間時是預留了3*n個字節的空間。

如果應用從不使用UTF-8編碼爲四個字節的字符,一切都沒有問題。但如果使用了,那麼就必須使用mysql從5.5版本開始提供的另一種字符集:utf8mb4(字面理解應該是multi-byte-4的意思吧?)。這個字符集解決了utf8中三個字節的限制問題,可以存儲佔用4個字節的unicode字符,也就是現在可以存儲全部的unicode字符了。同時,原有的utf8現在有了一個新名字:uft8mb3(仍然可以使用原來的utf8)。

一個4個字節UTF-8字符的例子,是在mac或者iOS設備上輸入文字時的特殊字符,如使用拼音輸入kong,備選中會有一個非漢字的圖形字符mysql中的utf8字符集與標準UTF-8的區別 - 鼕鼕青 - 鼕鼕青的博客,它的unicode編號是1F233,UTF-8編碼是F0 9F 88 B3(4個字節),UTF-16編碼是D83C DE33(佔用兩個16位單元,也是4個字節)。這個字符就無法存儲進mysql的utf8字符集中,必須使用utf8mb4才行。

參考文章:https://mathiasbynens.be/notes/mysql-utf8mb4

注:
如果要把一個已有的表的字符集從utf8改爲utf8mb4以支持BMP範圍以外的unicode字符,需要執行以下操作:
1)修改表的默認字符集設置:

alter table xxx set default character set = utf8mb4;
alter table xxx convert to character set utf8mb4;

2)如果想把全庫的默認字符集也改了,可以:

alter database xxx set default character set = utf8mb4;

3)修改my.cnf中的服務器默認字符集設置

server_character_set = utf8mb4

mysql文檔中說該設置僅僅影響新建數據庫時爲新數據庫選擇何種默認字符集,所以我理解更改一個已有數據庫不需要修改它的值(試想我在該mysql服務器上有好多數據庫,但只想對其中一個啓用utf8mb4)。但從實際使用來看,必須把這個配置設爲utf8mb4。具體原因我還沒搞明白。可能這個變量還用作在應用建立數據庫連接時的缺省字符集?
4)重新啓動mysql服務。需要這一步是因爲我們改動了my.cnf中的配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章