在創建資料庫時,我們經常會需要填寫資料庫名、字符集、排序規則。
而本文主要講述常用的存儲字符集 utf8 和 utf8mb4;排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
一般我本人創建創建資料庫通常排序規則都使用utf8mb4_general_ci,因為對特殊字符的順序並不需要那麼精確。
1、存儲字符集 utf8 和 utf8mb4
utf8 是 mysql 中的一種字符集,只支持最長三個位元組的 utf-8 字符,也就是 unicode 中的基本多文本平面。
要在 mysql 中保存 4 位元組長度的 utf-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後的才支持。我覺得,為了獲取更好的兼容性,應該總是使用 utf8mb4 而非 utf8.對於 char 類型數據,utf8mb4 會多消耗一些空間,根據 mysql 官方建議,使用 varchar 替代 char
總結:
utf-8是使用1~4個位元組,一種變長的編碼格式,字符編碼。mb4即 most bytes 4,使用4個位元組來表示完整的utf-8。
mysql的 utf8 編碼最大字符長度為 3 位元組,如果遇到 4 位元組的寬字符就會插入異常了。三個位元組的 utf-8 最大能編碼的 unicode 字符是 0xffff,也就是 unicode 中的基本多文種平面(bmp)。也就是說,任何不在基本多文本平面的 unicode字符,都無法使用 mysql 的 utf8 字符集存儲。包括 emoji 表情(emoji 是一種特殊的 unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 unicode 字符等等。
mysql的utf8是utfmb3,只有三個位元組,節省空間但不能表達全部的utf-8。所以推薦使用utf8mb4(是utf8的超集並完全兼容它,能夠用四個位元組存儲更多的字符,這幾乎包含了世界上所有能看到見的語言。)。
2、排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
mysql常用排序規則utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin
ci即case insensitive,不區分大小寫。
utf8mb4_unicode_ci:
是基於標準的unicode來排序和比較,能夠在各種語言之間精確排序,unicode排序規則為了能夠處理特殊字符的情況,實現了略微複雜的排序算法。
utf8mb4_general_ci:
是一個遺留的 校對規則,不支持擴展,它僅能夠在字符之間進行逐個比較。utf8_general_ci校對規則進行的比較速度很快,但是與使用 utf8mb4_unicode_ci的校對規則相比,比較正確性較差。
utf8mb4_bin:
將字符串每個字符用二進制數據編譯存儲,區分大小寫,而且可以存二進制的內容。
utf8mb4_0900_ai_ci:
mysql 8.0 默認的是 utf8mb4_0900_ai_ci,屬於 utf8mb4_unicode_ci 中的一種,具體含義如下:
uft8mb4 表示用 utf-8 編碼方案,每個字符最多占 4 個位元組。
0900 指的是 unicode 校對算法版本。(unicode 歸類算法是用於比較符合 unicode 標準要求的兩個 unicode 字符串的方法)。
ai 指的是口音不敏感。也就是說,排序時 e,è,é,ê 和 ë 之間沒有區別。
ci 表示不區分大小寫。也就是說,排序時 p 和 p 之間沒有區別。
utf8mb4 已成為默認字符集,在 mysql 8.0.1 及更高版本中將 utf8mb4_0900_ai_ci 作為默認排序規則。以前,utf8mb4_general_ci 是默認排序規則。由於 utf8mb4_0900_ai_ci 排序規則現在是默認排序規則,因此默認情況下新表格可以存儲基本多語言平面之外的字符。現在可以默認存儲表情符號。如果需要重音靈敏度和區分大小寫,則可以使用 utf8mb4_0900_as_cs 代替。
2.1、經常使用的 utf8mb4_unicode_ci 和 utf8mb4_general_ci 的區別。
1、準確性
utf8mb4_unicode_ci 是基於標準的 unicode 來排序和比較,能夠在各種語言之間精確排序。
utf8mb4_general_ci 沒有實現 unicode 排序規則,在遇到某些特殊語言或者字符集,排序結果可能不一致。
但是絕大多數情況下,這些特殊字符的順序並不需要那麼精確。
2、性能
utf8mb4_general_ci 在比較和排序的時候更快。
utf8mb4_unicode_ci 在特殊情況下,unicode 排序規則為了能夠處理特殊字符的情況,實現了略微複雜的排序算法。
但是在絕大多數情況下,不會發生此類複雜比較。相比選擇哪一種 collation,使用者更應該關心字符集與排序規則在 db 里需要統一。
推薦用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也沒啥問題。
- 編程問答
- 答案列表
MySQL utf8mb4_unicode_ci 什麼版本開始支持[朗讀]
加入收藏