在創(chuàng)建數(shù)據(jù)庫時,我們經(jīng)常會需要填寫數(shù)據(jù)庫名、字符集、排序規(guī)則;
而本文主要講述常用的存儲字符集 utf8 和 utf8mb4;排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
一般我本人創(chuàng)建創(chuàng)建數(shù)據(jù)庫通常排序規(guī)則都使用utf8mb4_general_ci,因為對特殊字符的順序并不需要那么精確
1、存儲字符集 utf8 和 utf8mb4
- utf8 是 Mysql 中的一種字符集,只支持最長三個字節(jié)的 UTF-8 字符,也就是 Unicode 中的基本多文本平面。
- 要在 Mysql 中保存 4 字節(jié)長度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持。我覺得,為了獲取更好的兼容性,應(yīng)該總是使用 utf8mb4 而非 utf8. 對于 CHAR 類型數(shù)據(jù),utf8mb4 會多消耗一些空間,根據(jù) Mysql 官方建議,使用 VARCHAR 替代 CHAR。
總結(jié):
UTF-8是使用1~4個字節(jié),一種變長的編碼格式,字符編碼。mb4即 most bytes 4,使用4個字節(jié)來表示完整的UTF-8。
mysql的 utf8 編碼最大字符長度為 3 字節(jié),如果遇到 4 字節(jié)的寬字符就會插入異常了。三個字節(jié)的 UTF-8 最大能編碼的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文種平面(BMP)。也就是說,任何不在基本多文本平面的 Unicode字符,都無法使用 Mysql 的 utf8 字符集存儲。包括 Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見于 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 Unicode 字符等等。
MySQL的utf8是utfmb3,只有三個字節(jié),節(jié)省空間但不能表達全部的UTF-8。所以推薦使用utf8mb4(是utf8的超集并完全兼容它,能夠用四個字節(jié)存儲更多的字符,這幾乎包含了世界上所有能看到見的語言。)。
2、排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
MySQL常用排序規(guī)則utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin
ci即case insensitive,不區(qū)分大小寫。
utf8mb4_unicode_ci:
是基于標準的Unicode來排序和比較,能夠在各種語言之間精確排序,Unicode排序規(guī)則為了能夠處理特殊字符的情況,實現(xiàn)了略微復(fù)雜的排序算法。
utf8mb4_general_ci:
是一個遺留的 校對規(guī)則,不支持擴展,它僅能夠在字符之間進行逐個比較。utf8_general_ci校對規(guī)則進行的比較速度很快,但是與使用 utf8mb4_unicode_ci的校對規(guī)則相比,比較正確性較差。
utf8mb4_bin:
將字符串每個字符用二進制數(shù)據(jù)編譯存儲,區(qū)分大小寫,而且可以存二進制的內(nèi)容。
utf8mb4_0900_ai_ci:
MySQL 8.0 默認的是 utf8mb4_0900_ai_ci,屬于 utf8mb4_unicode_ci 中的一種,具體含義如下:
uft8mb4 表示用 UTF-8 編碼方案,每個字符最多占 4 個字節(jié)。
0900 指的是 Unicode 校對算法版本。(Unicode 歸類算法是用于比較符合 Unicode 標準要求的兩個 Unicode 字符串的方法)。
ai 指的是口音不敏感。也就是說,排序時 e,è,é,ê 和 ? 之間沒有區(qū)別。
ci 表示不區(qū)分大小寫。也就是說,排序時 p 和 P 之間沒有區(qū)別。
utf8mb4 已成為默認字符集,在 MySQL 8.0.1 及更高版本中將 utf8mb4_0900_ai_ci 作為默認排序規(guī)則。以前,utf8mb4_general_ci 是默認排序規(guī)則。由于 utf8mb4_0900_ai_ci 排序規(guī)則現(xiàn)在是默認排序規(guī)則,因此默認情況下新表格可以存儲基本多語言平面之外的字符?,F(xiàn)在可以默認存儲表情符號。如果需要重音靈敏度和區(qū)分大小寫,則可以使用 utf8mb4_0900_as_cs 代替。
2.1、經(jīng)常使用的 utf8mb4_unicode_ci 和 utf8mb4_general_ci 的區(qū)別
1、準確性
utf8mb4_unicode_ci 是基于標準的 Unicode 來排序和比較,能夠在各種語言之間精確排序
utf8mb4_general_ci 沒有實現(xiàn) Unicode 排序規(guī)則,在遇到某些特殊語言或者字符集,排序結(jié)果可能不一致。
但是絕大多數(shù)情況下,這些特殊字符的順序并不需要那么精確。
2、性能
utf8mb4_general_ci 在比較和排序的時候更快
utf8mb4_unicode_ci 在特殊情況下,Unicode 排序規(guī)則為了能夠處理特殊字符的情況,實現(xiàn)了略微復(fù)雜的排序算法。
但是在絕大多數(shù)情況下,不會發(fā)生此類復(fù)雜比較。相比選擇哪一種 collation,使用者更應(yīng)該關(guān)心字符集與排序規(guī)則在 db 里需要統(tǒng)一。文章來源:http://www.zghlxwxcb.cn/news/detail-799206.html
推薦用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也沒啥問題.文章來源地址http://www.zghlxwxcb.cn/news/detail-799206.html
到了這里,關(guān)于MySQL常用排序規(guī)則utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci和存儲字符集 utf8 和 utf8mb4的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!