暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 的 UTF-8 不是真实的

原创 Bigbig 2022-08-17
424

如果您熟悉 MySQL,您可能已经知道它带有多种字符编码。一般来说,在 MySQL 世界和网络上的主要编码之一是 UTF-8 - 它几乎用于所有网络和移动应用程序,并且就MySQL 而言被广泛认为是“默认”选项. UTF-8 还支持多种字符集,并且还有一些独特的其他特性:在这篇博客中,我们将介绍它们,而且我们还将特别介绍一个特性 - MySQL 的“UTF -8" 不被认为是“真正的“UTF-8”。这使你感到困惑的话,那就请接着读下去!

什么是 UTF-8?

首先,UTF-8 是最常见的字符编码之一。在 UTF-8 中,我们拥有的每个字符都由一到四个字节的范围表示。因此,我们有几个字符集:

  • utf8 在过去被认为是 MySQL 的“事实上的”标准。本质上,utf8 也可以被认为是 utf8mb3 的“别名”。
  • utf8mb3 每个字符使用一到三个字节。
  • utf8mb4 每个字符使用一到四个字节。

UTF8 是过去 MySQL 刚起步时的默认字符集,一切都很好。但是,最近与 MySQL 数据库管理员交谈,您会很快意识到现在情况已不再如此。简而言之,utf8 不再是默认字符集 ,而utf8mb4 是。

utf8 与 utf8mb4

utf8 和 utf8mb4 分离的核心原因是 UTF-8 不同于正确的 UTF-8 编码。之所以如此,是因为 UTF-8 不提供完整的 Unicode 支持,这可能导致数据丢失甚至安全问题。UTF-8 未能完全支持 Unicode 是真正的问题——UTF-8 编码每个字符最多需要四个字节,而 MySQL 提供的“utf8”编码只支持三个。看到这方面的问题了吗?换句话说,如果我们想存储这样表示的表情符号:

image.png

我们做不到,不是 MySQL 会以“???”的格式存储它 或类似的形式,但它不会完全存储,并会响应如下错误消息:

Incorrect string value: '\x77\xD0' for column 'demo_column' at row 1

有了这个错误消息,MySQL 是在说“好吧,我不认识这个笑脸是由哪些字符组成的。抱歉,我在这里无能为力”——此时,您可能想知道正在采取什么措施来克服这种情况一个问题。MySQL 是否知道它的存在?事实上,如果说 MySQL 不知道这个问题,那将是一个谎言——相反,他们知道,但是 MySQL 开发人员从来没有解决这个问题。相反,他们在十多年前与 MySQL 5.5.3 一起发布了一种解决方法。

该解决方法称为“utf8mb4”。utf8mb4 与它的旧版本 - utf8 几乎相同 - 只是编码使用每个字符一到四个字节,这基本上意味着它能够支持更广泛的符号和字符。

使用 MySQL 8.0,稍微处理一下数据,你很快就会注意到 utf8mb4 确实是 MySQL 中可用的默认字符集——而且,据推测,在不久的将来 utf8mb4 将成为 MySQL 中 utf8 标准的参考。

utf8mb4

随着时间的推移,utf8 在几乎所有方面都被 utf8mb4 超越,很自然地,可以使用一些排序规则的变体。从本质上讲,这些排序规则充当了一种排序规则的“集合”,旨在更好地适应特定的数据集。utf8mb4 也有几个:

utf8mb4_general_ci旨在更“通用”地使用 MySQL 和 utf8。该字符集被广泛认为是数据存储的“捷径”,在某些情况下可能会导致排序错误以提高速度。
utf8mb4_unicode_ci面向“高级”用户 - 也就是说,它是一组基于 Unicode 的排序规则,我们可以放心,如果使用此排序规则,我们的数据将得到正确处理。
在这种情况下,请注意_ci排序规则的“”结尾:代表“不区分大小写”。不区分大小写与排序和比较有关。

utf8mb4 这两种“风格”的使用越来越多——随着更新版本的 MySQL 也在发布,我们还可以看到utf8mb4_unicode_ci排序规则是当今大多数使用 MySQL 的人的首选排序规则。一个事实是肯定的 - 并非所有以这种方式使用 MySQL 的人都知道 utf8mb4 与其对应的 utf8 相比所呈现的功能和优势,但是当他们导入具有不寻常字符的数据时,他们肯定会看到不同!我们说服你去 utf8mb4 领域了吗?

正确使用基于 utf8mb4 的数据

以下是一些开发人员如何基于 utf8mb4 创建数据库和表:

image.png

除了这个查询给我们一个错误(在查询下方),这对于初学者和高级开发人员来说是一个常见的混淆点 - MySQL 本质上是说当我们使用基于 utf8mb4 的排序规则时,我们还应该使用兼容的字符集,在这种情况下, latin1 无效,所以无论你做什么,请记住以下几点:

utf8mb4 不是 MySQL 及其风格(MariaDB 和 Percona Server)中真正的 utf8:utf8 只支持 3 个字节的数据,utf8mb4 支持 4 个字节,这是 utf8 首先应该做的。如果使用 utf8,某些字符可能无法正常显示。

当我们选择在 MySQL 中使用 utf8mb4 而不是 utf8 时,我们还应该确保使用适当的字符集(utf8mb4)。注意查询下方的成功消息:

image.png

现在我们可以开始了——我们可以将各种字符存储在我们的数据库中,并且不会出现 MySQL 错误并出现“不正确的字符串值”错误!

总结

MySQL 中的 UTF-8 已损坏 - 它无法像 UTF-8 那样支持每个字符四个字节。“utf8mb4”可以用来解决这个问题,而且它通常很容易使用 - 只需选择一个特定的排序规则(在这种情况下,如果您将 MySQL 用于个人项目或小型网站,请选择 general 或 Unicode排序规则,或者如果您将它用于更技术性的事情,或者如果您想将 MySQL 推向极限。)

原文标题:MySQL’s UTF-8 Isn’t Real
原文作者:Lukas Vileikis
原文地址:https://dzone.com/articles/mysqls-utf-8-isnt-real

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论