探索MySQL?8中utf8mb4釋放多語言數(shù)據(jù)的強(qiáng)大潛力
引言
在現(xiàn)代 Web 應(yīng)用程序世界中,支持多種語言和字符集變得越來越重要。隨著全球化的興起,存儲和處理多語言數(shù)據(jù)的需求變得至關(guān)重要。MySQL 作為最流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng)之一,認(rèn)識到了這一需求,并在其 8.0 版本中引入了 utf8mb4。在這篇文章中,我們將通過實際示例探討 utf8mb4 及其在 MySQL 8 中的優(yōu)勢。
翻譯自
作者:Arunjith Aravindan
本文原文:https://www.percona.com/blog/the-power-of-utf8mb4-in-mysql-8-...
了解 utf8mb4
在深入探討 utf8mb4 的好處之前,我們先澄清一下 utf8mb4 代表什么。在 MySQL 中,“utf8”是指支持 Unicode 字符集的字符編碼,每個字符最多使用三個字節(jié)。然而,MySQL 中原始的 utf8 實現(xiàn)并沒有涵蓋所有 Unicode 字符。另一方面,utf8mb4 是 utf8 的修改版本,它支持完整的 Unicode 字符集,包括表情符號和其他補(bǔ)充字符,每個字符最多使用四個字節(jié)。
MySQL 中原始的 utf8 實現(xiàn)僅支持基本多文種平面(BMP)中的字符,大約占所有 Unicode 字符的 90%。另一方面,utf8mb4 支持整個 Unicode 字符集,包括表情符號和其他補(bǔ)充字符。它通過每個字符最多使用四個字節(jié)而不是 utf8 使用的三個字節(jié)來實現(xiàn)此目的。
下表顯示了 utf8 和 utf8mb4 之間的區(qū)別:
特征 | UTF8 | utf8mb3 | utf8mb4 |
---|---|---|---|
每個字符的最大字節(jié)數(shù) | 3 | 3 | 4 |
支持的字符 | 基本多文種平面 (BMP) | BMP | BMP + 輔助平面 |
MySQL 默認(rèn) | Yes | Yes | Yes(MySQL 8.0 開始) |
狀態(tài) | 已棄用 | 已棄用 | 未棄用 |
注意:歷史上,MySQL 使用字符集 utf8 作為 utf8mb3 的別名。但是,從 MySQL 8.0.28 開始,utf8mb3 僅在 SHOW 語句的輸出和信息架構(gòu)表中引用該字符集時使用。未來,utf8 有望成為 utf8mb4 的參考。為了避免任何歧義,建議在引用該字符集時顯式指定 utf8mb4。
如您所見,utf8、utf8mb3 和 utf8mb4 之間的主要區(qū)別在于每個字符的最大字節(jié)數(shù)。 utf8 和 utf8mb3 只能存儲 BMP 中的字符,而 utf8mb4 還可以存儲補(bǔ)充平面(Supplementary Plane)中的字符。這意味著 utf8mb4 可以支持更廣泛的字符,包括表情符號、數(shù)學(xué)符號和其他特殊字符。
這三個字符集之間的另一個區(qū)別是它們在 MySQL 中的默認(rèn)狀態(tài)。utf8 是 MySQL 5.7 及更早版本中的默認(rèn)字符集,而 utf8mb3 是 MySQL 8.0 中的默認(rèn)字符集。但是,utf8mb4 是 MySQL 8.0.28 及更高版本中的默認(rèn)字符集。
最后,MySQL 8.0 中已棄用 utf8 和 utf8mb3。這意味著它們最終將從 MySQL 中刪除,因此建議使用 utf8mb4 代替。
因此,如果您需要存儲所有 Unicode 字符,包括表情符號和其他補(bǔ)充字符,那么您應(yīng)該使用 utf8mb4。但是,如果您只需要存儲 BMP 中的字符,那么 utf8 可能就足夠了。
以下是使用 MySQL 表和查詢對 utf8 和 utf8mb4 進(jìn)行比較的示例:
對比示例
MySQL 5.7
mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.42-46 | +-----------+
Table
mysql> CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) CHARACTER SET utf8, email VARCHAR(255) CHARACTER SET utf8 ); Query OK, 0 rows affected (0.03 sec)
mysql> show create table usersG *************************** 1. row *************************** Table: users Create Table: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `email` varchar(255) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.01 sec)
在用戶表中插入三行數(shù)據(jù),包括 emoji 表情符號。
mysql> INSERT INTO users (name, email) VALUES ('Arun Jith', 'arunjith@example.com'), ('Jane Doe', 'janedoe@example.com'), ('??', 'emoji@example.com'); ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3 mysql>
遇到的錯誤消息 ERROR 1366 (HY000): Incorrect string value: ‘xF0x9Dx8Cx86’ for column ‘name’ at row 3,
第 3 行的 name
字段的字符編碼存在問題。用戶表嘗試將 Unicode 字符 ??
插入 name
字段時發(fā)生錯誤。
mysql> INSERT INTO users (name, email) VALUES ('Arun Jith', 'arunjith@example.com'), ('Jane Doe', 'janedoe@example.com') ; Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
MySQL 8.0
mysql> select version(); +-------------------------+ | version() | +-------------------------+ | 8.0.33-0ubuntu0.22.04.2 | +-------------------------+
Table
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) CHARACTER SET utf8, email VARCHAR(255) CHARACTER SET utf8 );
mysql> show create table usersG *************************** 1. row *************************** Table: users Create Table: CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
該表的 name
和 email
字段均使用 utf8mb3 字符集。這意味著該表可以存儲 BMP 中的所有字符,但不能存儲表情符號或其他補(bǔ)充字符。
Query
INSERT INTO users (name, email) VALUES ('Arun Jith', 'arunjith@example.com'), ('Jane Doe', 'janedoe@example.com'), ('??', 'emoji@example.com');
與前面的示例一樣的錯誤( ERROR 1366 (HY000): Incorrect string value: ‘xF0x9Dx8Cx86’ for column ‘name’ at row 3,
)。
mysql> INSERT INTO users (name, email) VALUES -> ('Arun Jith', 'arunjith@example.com'), -> ('Jane Doe', 'janedoe@example.com'), -> ('??', 'emoji@example.com'); ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3
mysql> INSERT INTO users (name, email) VALUES -> ('Arun Jith', 'arunjith@example.com'), -> ('Jane Doe', 'janedoe@example.com') -> ; Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
此查詢將前兩行數(shù)據(jù)插入用戶表中。前兩行包含簡單的文本數(shù)據(jù),而第三行包含emoji 表情符號。表情符號將無法正確存儲在數(shù)據(jù)庫中,因為 utf8 字符集無法存儲 emoji 表情符號。
Output
mysql> SELECT * FROM users; +----+-----------+----------------------+ | id | name | email | +----+-----------+----------------------+ | 4 | Arun Jith | arunjith@example.com | | 5 | Jane Doe | janedoe@example.com | +----+-----------+----------------------+ 2 rows in set (0.00 sec)
此查詢將從用戶表中選擇兩行。查詢的輸出將是用戶表中所有行的列表,包括每個用戶的 ID
、name
、email
。第三行有表情符號的無法存儲,插入時出錯,因為 utf8 字符集無法存儲表情符號。
Table
為了確保正確存儲表情符號,讓我們使用 utf8mb4 字符集創(chuàng)建表列。之后,我們可以繼續(xù)檢查表情符號插入是否正確。
mysql> CREATE TABLE users ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> name VARCHAR(255) CHARACTER SET utf8mb4, -> email VARCHAR(255) CHARACTER SET utf8mb4 -> ); Query OK, 0 rows affected (0.03 sec)
mysql> show create table usersG *************************** 1. row *************************** Table: users Create Table: CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
Query
INSERT INTO users (name, email) VALUES ('Arun Jith', 'arunjith@example.com'), ('Jane Doe', 'janedoe@example.com'), ('??', 'emoji@example.com');
mysql> INSERT INTO users (name, email) VALUES -> ('Arun Jith', 'arunjith@example.com'), -> ('Jane Doe', 'janedoe@example.com'), -> ('??', 'emoji@example.com'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0
該表對 name
和 email
列均使用 utf8mb4 字符集。這意味著該表可以存儲完整 Unicode 字符集中的所有字符,包括 emoji 表情符號和其他補(bǔ)充字符。
此查詢將三行數(shù)據(jù)插入用戶表中。前兩行包含簡單的文本數(shù)據(jù),而第三行包含表情符號。表情符號將正確存儲在數(shù)據(jù)庫中,因為 utf8mb4 字符集可以存儲表情符號。
Output
mysql> SELECT * FROM users; +----+-----------+----------------------+ | id | name | email | +----+-----------+----------------------+ | 1 | Arun Jith | arunjith@example.com | | 2 | Jane Doe | janedoe@example.com | | 3 | ?? | emoji@example.com | +----+----------+-----------------------+ 3 rows in set (0.00 sec)
此查詢將從用戶表中選擇所有行。查詢的輸出將是用戶表中所有行的列表,包括每個用戶的 ID
、name
、email
。表情符號將被存儲為表情符號,因為 utf8mb4 字符集可以存儲表情符號。
總結(jié)
如您所見,utf8mb4 字符集可以存儲完整 Unicode 字符集中的所有字符,包括表情符號和其他補(bǔ)充字符。這使得它成為存儲復(fù)雜文本數(shù)據(jù)、文本搜索和比較的不錯選擇。另一方面,utf8 字符集只能存儲 BMP 中的字符。這意味著它無法存儲表情符號或其他補(bǔ)充字符。
一般來說,建議所有新應(yīng)用程序都使用 utf8mb4。這將確保您的數(shù)據(jù)可以正確存儲和處理,無論它包含什么字符。
以上就是探索MySQL 8中utf8mb4釋放多語言數(shù)據(jù)的強(qiáng)大潛力的詳細(xì)內(nèi)容,更多關(guān)于MySQL utf8mb4多語言數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql 5.7.13 安裝配置方法圖文教程(linux)
這篇文章主要為大家詳細(xì)介紹了linux下mysql 5.7.13 安裝配置方法圖文教程,感興趣的小伙伴們可以參考一下2016-06-06MySQL的InnoDB擴(kuò)容及ibdata1文件瘦身方案完全解析
在使用InnoDB存儲引擎后,MySQL的ibdata1文件常常會占據(jù)大量存儲空間,這里我們就為大家?guī)鞰ySQL的InnoDB擴(kuò)容及ibdata1文件瘦身方案完全解析:2016-06-06MySQL優(yōu)化之如何了解SQL的執(zhí)行頻率
MySQL 客戶端連接成功后,通過 show [session|global]status 命令 可以提供服務(wù)器狀態(tài)信息,也可以在操作系統(tǒng)上使用 mysqladmin extended-status 命令獲得這些消息2014-05-05MySQL使用select語句查詢指定表中指定列(字段)的數(shù)據(jù)
本文介紹MySQL數(shù)據(jù)庫中執(zhí)行select查詢語句,查詢指定列的數(shù)據(jù),即指定字段的數(shù)據(jù),需要的朋友可以參考下2016-11-11關(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明
下面小編就為大家?guī)硪黄P(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03