切換語言為:簡體

如何在 MySQL 中儲存 Emoji 表情?

  • 爱糖宝
  • 2024-06-17
  • 2128
  • 0
  • 0

針對 Emoji 表情 MySQL 儲存是否支援的問題,結論是:

MySQL 中可以儲存 emoji 表情,但需要使用 UTF8MB4 字元編碼。如果使用 UTF8MB3,儲存這些擴充套件字元會導致解析錯誤。

課外補充

MySQL 對 Unicode 的支援

Unicode 字符集已成為電腦科學領域的業界標準,它整理、編碼了世界上大部分的文字系統,使得計算機能夠更簡便地呈現和處理文字。

爲了滿足不同的資料儲存和傳遞需求,人們開發了多種 Unicode Transformation Format(UTF)編碼。主要的 UTF 編碼包括 UTF-8、UTF-16 和 UTF-32 等。

根據 MySQL 官方文件

MySQL 主要支援以下字符集:utf8、ucs2、utf8mb3、utf8mb4、utf16、utf16le 和 utf32。這些字符集在支援的字元範圍和儲存空間需求上有所不同。

字符集 支援的字元 每個字元所需儲存空間
utf8mb3, utf8 BMP 1-3 位元組
ucs2 BMP 2 位元組
utf8mb4 BMP 和補充字元 1-4 位元組
utf16 BMP 和補充字元 2 或 4 位元組
utf16le BMP 和補充字元 2 或 4 位元組
utf32 BMP 和補充字元 4 位元組

在 MySQL 官方文件中,介紹了支援的編碼方式之後,還有一段醒目的提醒: 如何在 MySQL 中儲存 Emoji 表情?

以上文字大致意思是:"UTF8MB3 字符集已被棄用,它在未來的 MySQL 版本中將會被刪除,請使用 UTF8MB4 代替。在目前的 8.0 版本中,utf8 指的就是 UTF8MB3,雖然未來可能改成 UTF8MB4,但是爲了避免產生歧義,可以考慮為字符集引用顯式指定 UTF8MB4,而不是 utf8。"

這段話的意思是,MySQL 8.0 版本中使用 UTF-8 字元編碼實際上是使用了 utf8mb3 編碼方式,但 UTF8MB3 已經被棄用,並且在未來的 MySQL 版本中會被移除。因此,建議在設定字符集時明確指定 UTF8MB4,以避免將來可能引起的歧義和問題。

現在我們來詳細討論 UTF8MB3 的情況。

UTF8MB3

utf8mb3 字符集是 MySQL 早期支援的一種字符集,具有以下特徵:

  1. 僅支援 Basic Multilingual Plane(BMP)中的字元,不支援補充字元。

  2. 每個多位元組字元最多需要三個位元組來表示。

BMP 指的是基本多文種平面,其中的字元碼位範圍在 0 到 65535(或者用 Unicode 表示為 U+0000 到 U+FFFF)。這意味著 utf8mb3 無法儲存碼位在 U+10000 到 U+10FFFF 之間的補充字元,包括一些生僻的漢字和 Emoji 表情等。

因此,如果在建立 MySQL 表時使用 utf8mb3(即 utf-8)作為字元編碼方式,就無法正確儲存和處理補充字元。

UTF8MB4

早期的 Unicode 版本只使用了 0 到 0xFFFF 範圍的編碼,稱為 BMP(Basic Multilingual Plane)字符集。因此,最初 MySQL 設計時只涵蓋了支援 BMP 字符集的 utf8mb3(即 utf-8)。隨著需求增加,包含在 Unicode 標準中的字元數量也增加了。

因此,早期的 utf8mb3 在某些情況下無法滿足需求,特別是隨著 Unicode 標準支援更多字元時,三個位元組的編碼空間變得不足以覆蓋所有字元。

爲了解決這個問題,MySQL 在 5.5.3 版本之後引入了 utf8mb4 字符集。

utf8mb4 字符集具有以下特點:

  1. 支援 BMP 和補充字元,即能夠表示從 0 到 0x10FFFF 的所有 Unicode 字元。

  2. 每個多位元組字元最多需要四個位元組來編碼。

utf8mb4 與 utf8mb3 字符集不同的地方在於,utf8mb3 僅能表示 BMP 字元,而 utf8mb4 則能夠處理補充字元。對於 BMP 字元,utf8mb4 和 utf8mb3 的儲存方式相同,但對於補充字元,utf8mb4 需要四個位元組來儲存,而 utf8mb3 則無法處理這些字元。

因此,爲了確保能夠儲存和處理 Unicode 標準中的所有字元,特別是包括 Emoji 表情在內的補充字元,建議在建立 MySQL 表時使用 utf8mb4 字符集,而不是 utf8。

UTF8MB3 和 UTF8MB4 區別及優缺點

前面已經分別介紹了 utf8mb3 和 utf8mb4 字符集,它們的區別總結如下:

  • utf8mb3 只支援 BMP(Basic Multilingual Plane)中的字元,而 utf8mb4 則支援 BMP 以及補充字元。

  • 每個字元在 utf8mb3 中最多使用 3 個位元組來編碼,而在 utf8mb4 中最多使用 4 個位元組。

  • utf8mb4 能夠表示更多的補充字元,但因為每個字元可能使用更多的位元組,所以在儲存空間上可能會比 utf8mb3 佔用更大。

總之,utf8mb4 相比 utf8mb3 提供了更廣泛的字元支援,尤其是對於包含 Emoji 表情在內的補充字元,但這也可能導致資料儲存時佔用更多的空間。

從 utf8mb3 轉換成 utf8mb4

首先,將字符集從 utf8mb3 轉換到 utf8mb4 其實並不困難:

對於 BMP 字元,utf8mb4 和 utf8mb3 具有相同的儲存特性:相同的編碼值、相同的編碼方式以及相同的長度。

對於補充字元,utf8mb4 需要使用 4 個位元組進行儲存,而 utf8mb3 則無法儲存這些字元。當將使用 utf8mb3 的列轉換為 utf8mb4 時,您無需擔心補充字元的轉換問題,因為 utf8mb3 根本不支援補充字元。

假設已有一張表使用了 utf8mb3 字符集:

CREATE TABLE t1 (
  col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) CHARACTER SET utf8;

下面的語句將 t1 轉換為 utf8mb4:

ALTER TABLE t1
  DEFAULT CHARACTER SET utf8mb4,
  MODIFY col1 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  MODIFY col2 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.