我正在使用MySQL構建一個應用程序,其中中文名稱需要存儲在數據庫中。我試圖決定是否使用基本的utf8
編碼(只適用於基本多語言平面,並且每個字符最多存儲3個字節的UTF-8編碼),或者如果我需要使用utf8mb4
編碼,允許編碼/存儲來自較高平面的字符。中文名稱和Unicode基本多語言平面(BMP)
Unicode基本多語言平面(BMP)是否足以存儲所有中文專有名稱?
我正在使用MySQL構建一個應用程序,其中中文名稱需要存儲在數據庫中。我試圖決定是否使用基本的utf8
編碼(只適用於基本多語言平面,並且每個字符最多存儲3個字節的UTF-8編碼),或者如果我需要使用utf8mb4
編碼,允許編碼/存儲來自較高平面的字符。中文名稱和Unicode基本多語言平面(BMP)
Unicode基本多語言平面(BMP)是否足以存儲所有中文專有名稱?
TL; DR沒關係,堅持用utf8mb4
編碼,特別是對於新的應用。
長形式的回答:兩個編碼之間的關鍵區別在於,utf8
,由MySQL長支持,支持UTF8編碼字符長度最多爲3個字節。從5.5.3開始,正如@ rick-james所述,一種新的編碼,utf8mb4
放寬了這個限制,否則就沒有缺點。
根據該MySQL documentation,較新的utf8mb4
編碼升降機該任意三個字符的限制,並且有很少,如果有的缺點:
- 對於BMP字符,
utf8
和utf8mb4
具有相同的存儲特性:相同的碼值,相同的編碼,相同的長度。- 對於補充字符,
utf8
根本不能存儲字符,而utf8mb4
需要4個字節來存儲它。由於utf8
根本無法存儲該字符,因此在utf8
列中沒有補充字符,並且在升級舊版本的MySQL的utf8
數據時無需擔心轉換字符或丟失數據。
因此,我原來的問題是誤解:字節的最大數量,以一箇中國名字的每個字符編碼不應該的問題只要編碼使用實際上支持編碼所有Unicode代碼點。
MySQL的CHARACTER SET utf8
只能處理3字節的UTF-8代碼(BMP)。相反,使用CHARACTER SET utf8mb4
,它可處理所有4字節代碼。是的,包括當前爲中文,表情符號等定義的所有Unicode。
使用版本5.7(如果可行)。
我在這個問題上的初衷是爲了理解中文名稱是否需要支持Unicode BMP以外的字符,而Unicode只支持三字節最大的'utf8'編碼。事實上,這個問題本身有點誤解,就綠地應用而言,從'utf8mb4'編碼開始看起來似乎沒有任何缺點,無論如何看待角色佔用相同數量的空間。 –
中文確實有一些非BMP字符。 –
缺點是索引的限制爲767字節(直到5.7)。有多種解決方法。 –