儘管字面上非常相似,但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,
備選中會有乙個非漢字的圖形字元
1f233
,utf-8編碼是
f0 9f 88 b3(4個位元組),utf-16編碼是
d83c de33(占用兩個16位單元,也是4個位元組)。這個字元就無法儲存進mysql的utf8字符集中,必須使用utf8mb4才行。
參考文章: 注:
如果要把乙個已有的表的字符集從utf8改為utf8mb4以支援bmp範圍以外的unicode字元,需要執行以下操作:
1)修改表的預設字符集設定:
alter table *** set default character set = utf8mb4;2)如果想把全庫的預設字符集也改了,可以:alter table *** convert to character set utf8mb4;
alter database *** set default character set = utf8mb4;3)修改my.cnf中的伺服器預設字符集設定
server_character_set = utf8mb4mysql文件中說該設定僅僅影響新建資料庫時為新資料庫選擇何種預設字符集,所以我理解更改乙個已有資料庫不需要修改它的值(試想我在該mysql伺服器上有好多資料庫,但只想對其中乙個啟用utf8mb4)。但從實際使用來看,必須把這個配置設為utf8mb4。具體原因我還沒搞明白。可能這個變數還
用作在應用建立資料庫連線時的預設字符集?
4)重新啟動mysql服務。需要這一步是因為我們改動了my.cnf中的配置
UTF 8字符集的學習
今天因為擷取中文字串的原因,查了下utf 8字符集的資料,發現之前記憶的知識點有誤,之前一直以為utf 8中英文是1個位元組,其他語言的字元是3個位元組,查完資料後才發現utf 8字符集是一種變長字符集,每個字元占用位元組從1個到6個不等,恰好英文本元使用1個位元組,中文字元使用3個位元組,而且還知...
tinyxml解析UTF 8字符集的xml
今天在程式中遇到,當通訊的xml裡面含有中文字元的時候,tinyxml解析時總是報錯,不能進行解析,查詢原因後發現是tinyxml在解析utf 8字符集的xml時,需要特殊指定字符集才行,下面是對於讀取檔案和直接解析字串所需的tinyxml函式的使用方式。一 需解析的xml 21 0全天侯模板 11...
MySQL字符集utf8與utf8mb4
mysql在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的unicode。mysql支援的 utf8 編碼最大字元長度為 3 位元組,如果遇到 4 位元組的寬字元就會插入異常了。三個位元組的 utf 8 最大能編碼的 unicode 字...