MySQL 的字符集與排序規則

2021-10-19 09:02:42 字數 2868 閱讀 6684

今天突然被同事問到,mysql 裡的 uft8 與 utf8mb4 究竟有什麼區別,當時我也是一臉問號,因此特地去了解了一下。

uft8 與 utf8mb4 其實指的是 mysql 中的字符集,那到底什麼是字符集呢?

很多人常常會把字元字符集字元編碼的概念混為一談,今天我們仔細來看看。

何為字元?

字元(charcter)是文字與符號的總稱,包括文字、圖形符號、數學符號等。26個英文本母屬於字元,每個漢字也屬於乙個字元。

那麼什麼叫字符集?

字符集是一組抽象的字元(charcter)組合的集合。舉乙個例子,所有的漢字就算乙個「字元集合」, 所有的英語字母也算乙個「字元集合」。注意,我這裡說它們是字元集合,而且還有雙引號。是因為字符集並不簡單的是字元的集合, 準確概述來說,字符集是一套符號和編碼的規則。字符集需要以某種字元編碼方式來表示、儲存字元。我們知道,計算機內部,所有資訊最終都是乙個二進位制值。每乙個二進位制位(bit)有0和1兩種狀態。而如果用不同的0和1組合表示不同的字元就是編碼。

那什麼叫字元編碼呢?

字元最終是以二進位制形式儲存在磁碟的,這也是為什麼要有字元編碼的原因,因為計算機最終都要以二進位制形式儲存,那麼編碼規則就是用什麼樣的二進位制來代表這個字元。例如,我們所熟知的ascii碼表中,01000011這個二進位制對應的十進位制是67,它代表的就是英語字母c。準確概述來說,字元編碼方式是用乙個或多個位元組的二進位制形式表示字符集中的乙個字元。每種字符集都有自己特有的編碼方式,因此同乙個字元,在不同字符集的編碼方式下,可能會產生不同的二進位制形式。

既然我們經知道了 utf8 與 utf8mb4 都是一種字符集,那兩種到底有什麼區別呢?

mysql 在創立時使用的字符集就是 utf8。首先它能儲存下大部分的中文漢字,對於我們正常使用肯定是綽綽有餘的。

它由三個位元組組成,能組成的最大 unicode 字元是0xffff,也就是 unicode 中的基本多文種平面(bmp)。

也就是說,任何不在基本多文字平面的 unicode 字元,都無法使用 mysql 的 utf8 字符集儲存。

mysql 在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的 unicode。

新增的乙個位元組,可以讓它支援包括 emoji 表情(emoji 是一種特殊的 unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 unicode 字元等等。

我覺得,為了獲取更好的相容性,應該總是使用 utf8mb4 而非 utf8。

對於 char 型別資料,utf8mb4 會多消耗一些空間,根據 mysql 官方建議,可以使用 varchar 替代 char。

建立庫的時候,我們經常會使用語句:

create database dbname default charset utf8 collate utf8_general_ci;
既然我們知道了charset是代表字符集,那麼collate又代表什麼呢?它代表著排序規則。

mysql的排序規則(collation),一般指對字符集中字串之間的比較、排序制定的規則, myslq排序規則特徵:

o 兩個不同的字符集不能有相同的校對規則;

o 每個字符集有乙個預設校對規則;

其實對於排序規則的細節問題,我們關注較少,反而對排序規則中是否涉及大小寫敏感關注較多。

例如,系統使用 utf8 字符集,若使用 utf8_bin 排序規則,執行 sql 查詢時區分大小寫。使用 utf8_general_ci 不區分大小寫(預設的 utf8 字符集對應的校對規則是 utf8_general_ci)。

當前,utf8_unicode_ci 校對規則僅部分支援 unicode 校對規則演算法。一些字元還是不能支援。並且,不能完全支援組合的記號。這主要影響越南和俄羅斯的一些少數民族語言,如:udmurt 、tatar、bashkir和mari。

utf8_unicode_ci 的最主要的特色是支援擴充套件,即當把乙個字母看作與其它字母組合相等時。例如,在德語和一些其它語言中『ß』等於『ss』。

utf8_general_ci 是乙個遺留的校對規則,不支援擴充套件。它僅能夠在字元之間進行逐個比較。這意味著 utf8_general_ci 校對規則進行的比較速度很快,但是與使用 utf8_unicode_ci 的校對規則相比,比較正確性較差)。

對於一種語言僅當使用 utf8_unicode_ci 排序做的不好時,才執行與具體語言相關的utf8字符集 校對規則。例如,對於德語和法語,utf8_unicode_ci 工作的很好,因此不再需要為這兩種語言建立特殊的 utf8 校對規則。

utf8_general_ci 也適用於德語和法語,除了『ß』等於『s』,而不是『ss』之外。如果你的應用能夠接受這些,那麼應該使用 utf8_general_ci,因為它速度快。否則,使用 utf8_unicode_ci,因為它比較準確。

想不到 db 建立語句中的charsetcollate

都有這麼大的學問,碼農的學習之路真的是一刻都不能停止。

健程之道

初級程式設計師的健壯之路

mysql字符集與排序規則

資料庫需要適應各種語言和字元就需要支援不同的字符集 character set 每種字符集也有各自的排序規則 collation 系統管理在安裝時定義乙個預設的字符集和排序規則。也可以在建立資料庫時對資料庫範圍,建表時對錶級別,甚至列級別設定字元和排序規則。檢視排序規則 字尾 cs或者 ci的意思是...

mysql字符集 排序規則

select schema name 資料庫 default character set name 庫字符集 default collation name 庫排序規則 from information schema.schemata where default character set name ...

字符集與排序規則

1.常用字符集 gb2312 僅包含簡體中文 big5 僅包含正體中文 gbk 包含gb2312和big5等 unicode 通常採用utf8 utf16 utf32編碼 標準unicode 固定16位二進位制 就是utf16。2.sqlserver中非unicode字元和unicode字元 1.n...