前言:
我們都知道 MySQL 8.0 與 MySQL 5.7 的區(qū)別之一就是默認(rèn)字符集從 latin1 改成了 utf8mb4 办铡,除此之外者疤,MySQL 8.0 下的字符集和比較規(guī)則還有沒有其他變化呢?本篇文章我們一起來學(xué)習(xí)下氯窍。
utf8mb4 字符集
在 MySQL 8.0 中,utf8mb4 字符集是默認(rèn)的字符集設(shè)置墩邀,它是一個(gè)真正的 4 字節(jié) UTF-8 編碼穆桂,能夠存儲任何 Unicode 字符宫盔,包括表情符號、特殊符號以及其他復(fù)雜的文字享完。
utf8mb4 的使用場景包括但不限于:
- 存儲超出 utf8mb3 范圍的字符灼芭,如某些不常用的漢字和新增的 Unicode 字符。
- 存儲 emoji 表情驼侠,這些表情需要四字節(jié)的編碼姿鸿。
- 確保數(shù)據(jù)庫能夠支持國際化應(yīng)用,處理各種語言和特殊字符 倒源。
utf8mb4 是 utf8 的超集苛预,完全兼容它,并且理論上將原有的 utf8(實(shí)際上是 utf8mb3)修改為 utf8mb4 不會對已有的數(shù)據(jù)產(chǎn)生問題笋熬。
# 查看數(shù)據(jù)庫支持的字符集
# Default collation 列列出了該字符集的默認(rèn)比較規(guī)則热某,Maxlen 列指出了每個(gè)字符的最大字節(jié)數(shù)
mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
...
| utf8mb3 | UTF-8 Unicode | utf8mb3_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.01 sec)
# 查看系統(tǒng)字符集
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)
utf8mb4_0900_ai_ci 比較規(guī)則
MySQL 8.0 版本下,utf8mb4 默認(rèn)的比較規(guī)則是 utf8mb4_0900_ai_ci 胳螟,而 MySQL 5.7 utf8mb4 默認(rèn)的比較規(guī)則是 utf8mb4_general_ci 昔馋,下面我們一起來看下 utf8mb4 字符集下的比較規(guī)則。
# MySQL 8.0 版本utf8mb4字符集下的比較規(guī)則
mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';
+----------------------------+---------+-----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | Yes | Yes | 0 | NO PAD |
| utf8mb4_0900_as_ci | utf8mb4 | 305 | | Yes | 0 | NO PAD |
| utf8mb4_0900_as_cs | utf8mb4 | 278 | | Yes | 0 | NO PAD |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | PAD SPACE |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE |
| utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 | PAD SPACE |
| utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 | PAD SPACE |
...
| utf8mb4_vi_0900_as_cs | utf8mb4 | 300 | | Yes | 0 | NO PAD |
| utf8mb4_zh_0900_as_cs | utf8mb4 | 308 | | Yes | 0 | NO PAD |
+----------------------------+---------+-----+---------+----------+---------+---------------+
89 rows in set (0.00 sec)
# 查看系統(tǒng)比較規(guī)則
mysql> SHOW variables like 'coll%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)
# MySQL 5.7 版本utf8mb4字符集下的比較規(guī)則
admin@localhost [(none)] 16:03:33>SHOW COLLATION WHERE Charset = 'utf8mb4';
+------------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+------------------------+---------+-----+---------+----------+---------+
| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |
| utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |
| utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 |
| utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 |
| utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 |
| utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 |
| utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 |
| utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 |
| utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 |
| utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 |
| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 |
| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 |
| utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 |
| utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 |
| utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 |
| utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 |
| utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 |
| utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 |
| utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 |
| utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 |
| utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 |
| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 |
| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 |
| utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 |
+------------------------+---------+-----+---------+----------+---------+
26 rows in set (0.00 sec)
以上對比可以看出 MySQL 8.0 版本 utf8mb4 字符集下的比較規(guī)則多達(dá) 89 種糖耸,而 MySQL 5.7 只有 26 種秘遏,少的 63 種都是帶 0900 標(biāo)識的。并且 MySQL 8.0 版本 utf8mb4 字符集默認(rèn)的比較規(guī)則utf8mb4_0900_ai_ci 在 5.7 版本中是不存在的嘉竟。
查閱官方文檔得知邦危,0900 標(biāo)識符的比較規(guī)則是在 MySQL 8.0 版本中引入的,是基于 Unicode Collation Algorithm (UCA) 9.0.0 標(biāo)準(zhǔn)的比較規(guī)則舍扰,能提供更精確倦蚪、更現(xiàn)代的 Unicode 支持。
其余標(biāo)識符就是比較常見的了边苹,ci(case-insensitive):不區(qū)分大小寫陵且,cs(case-sensitive):區(qū)分大小寫,ai(accent-insensitive):不區(qū)分重音符號个束,as(accent-sensitive):區(qū)分重音符號慕购。
utf8mb4_0900_ai_ci 比較規(guī)則不區(qū)分大小寫且不區(qū)分重音符號,遵循更新版的 Unicode 標(biāo)準(zhǔn)播急,更好地支持了國際化和多語言環(huán)境脓钾。MySQL 8.0 建議采用此比較規(guī)則,它可以看作是 utf8mb4_general_ci 的升級版桩警,二者之間區(qū)別很小可训,在 8.0 版本下的區(qū)別之一是:utf8mb4_0900_ai_ci 不忽略末尾空格,而 utf8mb4_general_ci 忽略末尾空格,即 'abc ' 和 'abc' 在 utf8mb4_0900_ai_ci 比較規(guī)則下認(rèn)為是不相等的握截,而在 utf8mb4_general_ci 下是相等的飞崖。
總結(jié):
本篇文章介紹了 MySQL 8.0 版本中 utf8mb4 字符集及其比較規(guī)則,建議 8.0 版本保持默認(rèn)即可谨胞。如果你的數(shù)據(jù)庫是由 5.7 版本升級或遷移來的固歪,建議保持使用原先的 utf8mb4_general_ci 字符集。不過需要注意的是胯努,因 MySQL 5.7 沒有 utf8mb4_0900_ai_ci 比較規(guī)則牢裳,若有庫表使用此比較規(guī)則來導(dǎo)入 5.7 版本,則會報(bào)錯(cuò)無法執(zhí)行叶沛。