李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

MySQL 编码问题

Table of Contents

1. 问题表现

向以 utf8 为编码方式的 MariaDB 中存入一个 UTF-8 字符串,出现了一个错误:

Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1

目前已知,客户端和服务端都使用 UTF-8 编码,要保存的字符串也是合法的 UTF-8 编码。

2. 问题所在

MySQL 的 utf8 实际上不是真正的 UTF-8。

标准 UTF-8 编码方式以 8 位为一个最小编码单位,进行总长可变的编码,将一个 Unicode 码位编码为 1 到 4 个字节。

而 utf8 编码长度最长为三个字节。

这个 bug 一直保留了下来,MySQL 维护组在 2010 年发布了 utf8mb4 的字符集,绕过了这个问题。

然而,他们并没有把加入新字符集这个操作通知到大部分的开发者。

简单概括如下:

  • MySQL 的 utf8mb4 是真正的 UTF-8。
  • MySQL 的 utf8 是一种专属的编码,它能够编码的 Unicode 字符并不多。

所有在使用 utf8 的 MySQL 和 MariaDB 用户都应该改用 utf8mb4 ,永远不要使用 utf8。

MySQL 的 utf8 字符集与其他程序不兼容。



Last Update: 2023-05-18 Thu 08:57

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议