MySQL 8.0 字符集與比較規(guī)則介紹

前言:

我們都知道 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í)行叶沛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒲讯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灰署,更是在濱河造成了極大的恐慌判帮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溉箕,死亡現(xiàn)場離奇詭異晦墙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肴茄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門晌畅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寡痰,你說我怎么就攤上這事踩麦。” “怎么了氓癌?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贫橙。 經(jīng)常有香客問我贪婉,道長,這世上最難降的妖魔是什么卢肃? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任疲迂,我火速辦了婚禮,結(jié)果婚禮上莫湘,老公的妹妹穿的比我還像新娘尤蒿。我一直安慰自己,他們只是感情好幅垮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布腰池。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪示弓。 梳的紋絲不亂的頭發(fā)上讳侨,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音奏属,去河邊找鬼跨跨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囱皿,可吹牛的內(nèi)容都是我干的勇婴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嘱腥,長吁一口氣:“原來是場噩夢啊……” “哼耕渴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爹橱,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萨螺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后愧驱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慰技,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年组砚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吻商。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糟红,死狀恐怖艾帐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盆偿,我是刑警寧澤柒爸,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站事扭,受9級特大地震影響捎稚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜求橄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一今野、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罐农,春花似錦条霜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲凶。三九已至,卻和暖如春夹厌,著一層夾襖步出監(jiān)牢的瞬間豹爹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工矛纹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臂聋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓或南,卻偏偏與公主長得像孩等,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子采够,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355