教你如何在 MySQL 数据库中支持完整的Unicode

 更新时间:2023年01月06日 15:18:10   作者:火焰兔  
UTF-8 是一种可变宽度编码,它使用一到四个 8 位字节对每个符号进行编码,永远不要在MySQL中使用 utf8——总是使用 utf8mb4,对mysql支持 Unicode相关知识感兴趣的朋友一起看看吧

在你的数据库中使用 MySQL 的 utf8 字符集吗? 在这篇文章中,我将解释为什么你应该改用 utf8mb4,以及如何去做。

UTF-8

UTF-8编码可以表示Unicode字符集中的每一个符号,范围从到。 那是 1,114,112 个可能的符号。 (并非所有这些 Unicode 代码点都已分配字符,但这并不妨碍 UTF-8 能够对它们进行编码。)

UTF-8 是一种可变宽度编码;可以参考Unicode 字符集和 UTF-8、UTF-16、UTF-32 编码这篇文章 它使用一到四个 8 位字节对每个符号进行编码。 具有较低数字代码点值的符号使用较少的字节进行编码。 这样,UTF-8 针对使用 ASCII 字符和其他 BMP 符号(其代码点范围从 到 )的常见情况进行了优化——同时仍然允许星体符号(其代码点范围从 到 ) 被存储。

MySQL 中的 utf8

很长一段时间,我一直在为数据库、表和列使用 MySQL 的 utf8 字符集,假设它映射到上述 UTF-8 编码。 通过使用 utf8,我可以在我的数据库中存储我想要的任何符号——或者我是这么认为的。

在写 JavaScript 的内部字符编码时,我注意到无法将 符号插入到该站点后面的 MySQL 数据库中。 我尝试更新的列具有 排序规则,并且连接字符集设置为 utf8。

mysql> SET NAMES utf8; # just to emphasize that the connection charset is set to `utf8`
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE database_name.table_name SET column_name = 'foo𝌆bar' WHERE id = 9001;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> SELECT column_name FROM database_name.table_name WHERE id = 9001;
+-------------+
| column_name |
+-------------+
| foo         |
+-------------+
1 row in set (0.00 sec)

内容在第一个 符号处被截断,在本例中为 — 因此,尝试插入 实际上插入的是 ,导致数据丢失(并可能引入安全问题;见下文)。 MySQL 也返回一条警告消息:

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level   | Code | Message                                                                      |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

事实证明,MySQL 的 utf8 字符集仅部分实现了正确的 UTF-8 编码。 它只能存储由一到三个字节组成的 UTF-8 编码符号; 不支持占用四个字节的编码符号。

由于星体符号(其代码点范围从 到 )在 UTF-8 中均由四个字节组成,因此我们不能使用 MySQL 的 utf8 实现来存储它们。

这不仅会影响 字符,还会影响更重要的符号,例如 。 总共有 1,048,575 个可能的代码点是我们不能使用的。 事实上,MySQL 的 utf8 只允许我们存储所有可能的 Unicode 代码点的 5.88% 。 正确的 UTF-8 可以编码所有 Unicode 代码点的 100% 。

MySQL 中的 utf8mb4

幸运的是,MySQL 5.5.3(2010 年初发布)引入了一种名为 utf8mb4 的新编码,它映射到正确的 UTF-8,因此完全支持 Unicode,包括星体符号。

我们可以参考 MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

总结

永远不要在 MySQL 中使用 utf8——总是使用 utf8mb4。 更新数据库和代码可能需要一些时间,但绝对值得付出努力。 为什么要任意限制可以在数据库中使用的符号集? 为什么每次用户输入星体符号作为评论或消息的一部分或我们存储在数据库中的任何内容时,都会丢失数据? 没有理由不在所有地方争取完全的 支持。 做正确的事,使用 utf8mb4。

到此这篇关于如何在 MySQL 数据库中支持完整的 Unicode的文章就介绍到这了,更多相关mysql支持 Unicode内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql数据库之索引优化

    Mysql数据库之索引优化

    MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。本文给大家介绍mysql数据库之索引优化,感兴趣的朋友一起学习吧
    2016-03-03
  • IDEA链接MySQL报错08001和连接成功后不显示表的问题及解决方法

    IDEA链接MySQL报错08001和连接成功后不显示表的问题及解决方法

    这篇文章主要介绍了IDEA链接MySQL报错08001和连接成功后不显示表的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Mysql系统变量与状态变量详细介绍

    Mysql系统变量与状态变量详细介绍

    这篇文章主要介绍了Mysql系统变量与状态变量详细介绍,能够在程序运行过程中影响Mysql程序行为的变量称之为系统变量,想了解更多相关内容的小伙伴可以参考下面文章内容
    2022-09-09
  • 网站前端和后台性能优化的34条宝贵经验和方法

    网站前端和后台性能优化的34条宝贵经验和方法

    网站前端和后台性能优化的34条宝贵经验和方法,相关网页技术人员,需要注意的地方。
    2011-05-05
  • 通过mysqladmin远程管理mysql的方法

    通过mysqladmin远程管理mysql的方法

    在一些特殊场景下,想要远程重启mysql,以便让某些修改能及时的生效,但是mysql并没有提供远程重启的功能,唯一能做的就是远程关闭mysql服务
    2013-03-03
  • Mysql数据库按时间点恢复实战记录

    Mysql数据库按时间点恢复实战记录

    如果客户在某时间节点由于误操作,导致数据丢失,RDS管控服务是如何进行恢复的呢?通过Mysql数据库按时间点恢复该如何操作呢,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • MySQL中InnoDB的Memcached插件的使用教程

    MySQL中InnoDB的Memcached插件的使用教程

    这篇文章主要介绍了MySQL中InnoDB的Memcached插件的使用教程,借助MySQL本身的复制功能,我们可以说变相地实现Memcached的复制需要的朋友可以参考下
    2015-05-05
  • 全面详解MySQL单行函数分析

    全面详解MySQL单行函数分析

    MySQL常见的函数分为单行函数和分组函数,单行函数包含字符函数、数学函数、日期函数、流程控制函数等,下面就详细的来介绍一下MySQL单行函数
    2023-10-10
  • MySQL数据库命名规范及约定

    MySQL数据库命名规范及约定

    这篇文章主要介绍了MySQL数据库的操作规范及、表名约定、列名约定,需要的朋友可以参考下
    2014-03-03
  • mysql 8.0.12 解压版安装教程

    mysql 8.0.12 解压版安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.12 解压版安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论