在創(chuàng)建數(shù)據(jù)庫時,我們經(jīng)常會需要填寫數(shù)據(jù)庫名、字符集、排序規(guī)則
常用的存儲字符集 utf8 和 utf8mb4
排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
一、存儲字符集 utf8 和 utf8mb4
1、utf8
utf8 是 Mysql 中的一種字符集,只支持最長三個字節(jié)的 UTF-8 字符,也就是 Unicode 中的基本多文本平面
2、utf8mb4
要在 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é)存儲更多的字符,這幾乎包含了世界上所有能看到見的語言。)。
二、排序字符集
utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
MySQL常用排序規(guī)則utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin_ci
ci 是 case insensitive,不區(qū)分大小寫,即 "大小寫不敏感", a 和 A 會在字符判斷中會被當(dāng)做一樣的。
bin 是二進制, a 和 A 會別區(qū)別對待(例如運行SELECT * FROM table WHERE txt = 'a', 那么在utf8mb4_bin中就找不到 txt = 'A' 的那一行, 而 utf8mb4_general_ci 則可以)
1、utf8mb4_unicode_ci:
是基于標(biāo)準(zhǔn)的Unicode來排序和比較,能夠在各種語言之間精確排序,Unicode排序規(guī)則為了能夠處理特殊字符的情況,實現(xiàn)了略微復(fù)雜的排序算法
2、utf8mb4_general_ci:
是一個遺留的 校對規(guī)則,不支持?jǐn)U展,它僅能夠在字符之間進行逐個比較
不區(qū)分大小寫, utf8mb4_general_cs 區(qū)分大小寫
utf8_general_ci校對規(guī)則進行的比較速度很快,但是與使用 utf8mb4_unicode_ci的校對規(guī)則相比,比較正確性較差
3、utf8mb4_bin:
將字符串每個字符用二進制數(shù)據(jù)編譯存儲,區(qū)分大小寫,而且可以存二進制的內(nèi)容
4、utf8mb4_0900_ai_ci:
MySQL 8.0 默認(rèn)的是 utf8mb4_0900_ai_ci,屬于 utf8mb4_unicode_ci 中的一種,具體含義如下
uft8mb4 表示用 UTF-8 編碼方案,每個字符最多占 4 個字節(jié)
0900 指的是 Unicode 校對算法版本(Unicode 歸類算法是用于比較符合 Unicode 標(biāo)準(zhǔn)要求的兩個 Unicode 字符串的方法)
ai 指的是口音不敏感。也就是說,排序時 e,è,é,ê 和 ? 之間沒有區(qū)別
ci 表示不區(qū)分大小寫。也就是說,排序時 p 和 P 之間沒有區(qū)別
utf8mb4 已成為默認(rèn)字符集,在 MySQL 8.0.1 及更高版本中將 utf8mb4_0900_ai_ci 作為默認(rèn)排序規(guī)則
以前,utf8mb4_general_ci 是默認(rèn)排序規(guī)則。由于 utf8mb4_0900_ai_ci 排序規(guī)則現(xiàn)在是默認(rèn)排序規(guī)則,因此默認(rèn)情況下新表格可以存儲基本多語言平面之外的字符?,F(xiàn)在可以默認(rèn)存儲表情符號。如果需要重音靈敏度和區(qū)分大小寫,則可以使用 utf8mb4_0900_as_cs 代替。
utf8mb4_unicode_ci 和 utf8mb4_general_ci 的區(qū)別
1、準(zhǔn)確性
utf8mb4_unicode_ci 是基于標(biāo)準(zhǔn)的 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)一
【1】對于一種語言僅當(dāng)使用 utf8mb4_unicode_ci 排序做的不好時,才執(zhí)行與具體語言相關(guān)的utf8mb4字符集校對規(guī)則。例如,對于德語和法語,utf8mb4_unicode_ci工作的很好,因此不再需要為這兩種語言創(chuàng)建特殊的utf8mb4校對規(guī)則
【2】utf8mb4_general_ci 也適用德語、法語或者俄語,但會有不準(zhǔn)。如果你的應(yīng)用能夠接受這些,那么應(yīng)該使用 utf8mb4_general_ci,因為它速度快。否則,使用utf8mb4_unicode_ci,因為它比較準(zhǔn)確
雖然推薦用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也沒啥問題文章來源:http://www.zghlxwxcb.cn/news/detail-697255.html
因為utf8mb4_unicode_ci比較準(zhǔn)確,utf8mb4_general_ci速度比較快。通常情況下,新建數(shù)據(jù)庫 和 建 varchar字符集類型字段 時一般選用?
utf8mb4_general_ci?
就可以文章來源地址http://www.zghlxwxcb.cn/news/detail-697255.html
到了這里,關(guān)于MySQL - 常用排序規(guī)則utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci和存儲字符集 utf8 和 utf8的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!