MySQL8.0中utf8mb4的强大:释放多语言数据的全部潜能
2023-07-15 14:05 abce 阅读(673) 评论(0) 编辑 收藏 举报
在现代网络应用中,支持多种语言和字符集变得越来越重要。随着全球化的兴起,存储和处理多语言数据的需求已变得至关重要。MySQL作为最流行的关系数据库管理系统之一,它意识到了这一需求,并在其8.0版本中引入了utf8mb4,从而改变了游戏规则。在本文中,我们将通过实际示例探讨utf8mb4及其在MySQL 8.0中的优势。
理解utf8mb4
在深入了解utf8mb4的优势之前,让我们先弄清楚utf8mb4代表什么。在MySQL中,"utf8"指的是支持Unicode字符集的字符编码,每个字符最多使用三个字节。另一方面,utf8mb4是utf8的一个修改版本,它支持完整的Unicode字符集,包括表情符号和其他补充字符,每个字符最多使用4个字节。
MySQL中最初的utf8实现只支持基本多语言(Basic Multilingual Plane, BMP)的字符,这大约占所有Unicode字符的90%。utf8mb4支持整个Unicode字符集,包括表情符号和其他补充字符。它通过每个字符最多使用四个字节而不是utf8使用的三个字节来实现这一点。
下面的表格显示了utf8和utf8mb4之间的区别:
历史上,MySQL使用字符集utf8作为utf8mb3的别名。然而,从MySQL 8.0.28开始,utf8mb3仅在SHOW语句的输出和Information Schema表中引用该字符集时使用。将来,utf8有望成为对utf8mb4的引用。为避免任何歧义,建议在引用该字符集时明确指定utf8mb4。
可以知道,utf8、utf8mb3和utf8mb4之间的主要区别在于每个字符的最大字节数。utf8和utf8mb3只能存储基本多语言(BMP)中的字符,而utf8mb4还可以存储Supplementary Plane中的字符。这意味着utf8mb4可以支持更多字符,包括表情符号、数学符号和其他特殊字符。
utf8是MySQL 5.7及更早版本的默认字符集,而utf8mb3是MySQL 8.0的默认字符集。但是,在MySQL 8.0.28及更高版本中,utf8mb4是默认字符集。
最后,utf8和utf8mb3在MySQL 8.0中被弃用。这意味着它们最终将从MySQL中移除,因此建议使用utf8mb4代替。
因此,如果需要存储所有Unicode字符,包括表情符号和其他补充字符,那么应该使用utf8mb4。但是,如果只需要存储BMP中的字符,那么utf8可能就足够了。
下面是使用MySQL表和查询比较utf8和utf8mb4的示例:
MySQL 5.7
1 2 3 4 5 6 | mysql> select version(); + ------------+ | version() | + ------------+ | 5.7.23-log | + ------------+ |
表
1 2 3 4 5 | CREATE TABLE abce ( id INT AUTO_INCREMENT PRIMARY KEY , name VARCHAR (255) CHARACTER SET utf8, email VARCHAR (255) CHARACTER SET utf8 ); |
1 2 3 4 5 6 7 8 9 10 11 12 | mysql> show create table abce\G *************************** 1. row *************************** Table : abce Create Table : CREATE TABLE `abce` ( `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=utf8 COLLATE =utf8_bin 1 row in set (0.00 sec) mysql> |
插入三行记录,包含emoji:
1 2 3 4 5 | mysql> INSERT INTO abce ( name , email) VALUES -> ( 'Arun Jith' , 'arunjith@example.com' ), -> ( 'Jane Doe' , 'janedoe@example.com' ), -> ( '𝌆' , 'emoji@example.com' ); ERROR 1366 (HY000): Incorrect string value: '\xF0\x9D\x8C\x86' for column 'name' at row 3 |
遇到的错误:"ERROR 1366 (HY000): Inorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3," 提示'abce'表中'name'列使用的字符编码有问题。当尝试在 "name"列中插入Unicode字符"𝌆"时发生了错误。
1 2 3 4 5 6 7 | mysql> INSERT INTO abce ( name , email) VALUES -> ( 'Arun Jith' , 'arunjith@example.com' ), -> ( 'Jane Doe' , 'janedoe@example.com' ); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> |
MySQL 8.0
1 2 3 4 5 6 | > select version(); + -----------+ | version() | + -----------+ | 8.0.30 | + -----------+ |
表
1 2 3 4 5 6 | > CREATE TABLE abce ( -> id INT AUTO_INCREMENT PRIMARY KEY , -> name VARCHAR (255) CHARACTER SET utf8, -> email VARCHAR (255) CHARACTER SET utf8 -> ); Query OK, 0 rows affected, 2 warnings (0.01 sec) |
1 2 3 4 5 6 7 8 9 10 | > show create table abce\G *************************** 1. row *************************** Table : abce Create Table : CREATE TABLE `abce` ( `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) |
该表的姓名和电子邮件列均使用utf8mb3字符集。这意味着该表可以存储BMP中的所有字符,但不能存储表情符号或其他补充字符。
查询
1 2 3 4 | INSERT INTO abce ( name , email) VALUES ( 'Arun Jith' , 'arunjith@example.com' ), ( 'Jane Doe' , 'janedoe@example.com' ), ( '𝌆' , 'emoji@example.com' ); |
与前面的示例一样,遇到的错误消息:"ERROR 1366 (HY000): Inorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3,"(不正确的字符串值:第3行'name'列的'xF0x9Dx8Cx86')表明'abce'表中'name'列使用的字符编码有问题。当尝试在 "name"列中插入Unicode字符"𝌆"时发生了错误。
1 2 3 4 5 | > INSERT INTO abce ( name , email) VALUES -> ( 'Arun Jith' , 'arunjith@example.com' ), -> ( 'Jane Doe' , 'janedoe@example.com' ), -> ( '𝌆' , 'emoji@example.com' ); ERROR 1366 (HY000): Incorrect string value: '\xF0\x9D\x8C\x86' for column 'name' at row 3 |
1 2 3 4 | > INSERT INTO abce ( name , email) VALUES -> ( 'Arun Jith' , 'arunjith@example.com' ), -> ( 'Jane Doe' , 'janedoe@example.com' ); Query OK, 2 rows affected (0.00 sec) |
为了确保表情符号的正确存储,让我们使用utf8mb4字符集创建表列。之后,我们可以继续检查表情符号插入是否正常。
1 2 3 4 5 6 | > CREATE TABLE abce ( -> id INT AUTO_INCREMENT PRIMARY KEY , -> name VARCHAR (255) CHARACTER SET utf8mb4, -> email VARCHAR (255) CHARACTER SET utf8mb4 -> ); Query OK, 0 rows affected (0.02 sec) |
1 2 3 4 5 6 7 8 9 10 | >show create table abce\G *************************** 1. row *************************** Table : abce Create Table : CREATE TABLE `abce` ( `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) |
1 2 3 4 5 6 | > INSERT INTO abce ( name , email) VALUES -> ( 'Arun Jith' , 'arunjith@example.com' ), -> ( 'Jane Doe' , 'janedoe@example.com' ), -> ( '𝌆' , 'emoji@example.com' ); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 |
一般来说,建议所有新应用程序使用utf8mb4。这将确保数据能够正确存储和处理,无论其中包含哪些字符。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2019-07-15 postgres开启慢查询日志
2015-07-15 RHEL7 -- systemd
2015-07-15 RHEL7 -- 识别文件系统和设备
2015-07-15 11G新特性 -- 块介质恢复性能增强(block media recovery)