• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Django存储emoji到MySQL

MySQL 彭东稳 6年前 (2018-04-11) 24193次浏览 已收录 0个评论

一、问题描述

目前来说,多数 MySQL 都是以 utf8 存储,注意 MySQL 的 utf8 和我们所说的传统 utf8 有点区别。MySQL 的 utf8 实际上不是真正的 UTF-8,MySQL 的 utf8 编码规定了最多只能有 3 个字节,而真正的 UTF-8 是每个字符最多四个字节。

MySQL 一直没有修复这个 bug,他们在 2010 年发布了一个叫作 utf8mb4 的字符集,绕过了这个问题。

简单概括如下:

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

所以,所有在使用 utf8 的 MySQL 和 MariaDB 用户都应该改用 utf8mb4,永远都不要再使用 utf8。utf8mb4 向下兼容 utf8。

经典问题 emoji 表情,emoji 表情的 unicode 已经超过了 3 个字节,因此 MySQL 的 utf8 无法识别与存储 emoji。从 MySQL 5.5 版本后开始支持 utf8mb4,这种编码支持 1 ~ 4 个字节,这种编码可以表示 emoji。另外 utf8mb4 向下兼容 utf8。

为了验证一下以上问题,我使用 Django 简单构建了一个应用,用来存储 emoji。下面是简化了很多 Django 的很多操作,所以需要有一定基础才可以运行起来。

假设我们有一个非常简单的 Django 应用来管理评论,假设你已经创建了项目,并且创建了应用,应用并且已经加入到了settings.py

二、应用创建

我们的模型将是一个Comment类,有两个字段:一个文本字段和一个作者字段。在 Django 的世界里,这个存储模型的文件是models.py

然后创建一个视图,将显示评论列表,在views.py

这里我们直接继承了 Django 内置的 ListView 类,用于方便展示列表数据,可以很快实现分页展示。

关联的模板位于templates/comments/comment_list.html

admin.py创建/编辑我们的看法:

然后,我们的数据库配置在settings.py

最后,配置urls.py

创建一个超级用户:

如果您打开管理页面,并创建一个包含表情符号的新评论:

Django存储emoji到MySQL

Django 将抛出一个异常:Incorrect string value: ’\xF0\x9F\x90\xAF’ for column ’text’ at row 1

三、问题解决

1. 把 MySQL 从 utf8 切换到 utf8mb4

你应该看到类似如下信息:

因此,首先,我们要更改数据库,表的字符集和排序规则属性,以使用 utf8mb4,而不是 utf8。

2. 修改服务器应用程序代码以使用正确的字符集

超简单,只需添加'OPTIONS': {'charset': 'utf8mb4'}到您的 DATABASES 配置:

这应该足够了。如果你重新启动服务器,你应该可以在任何评论中插入 emoji。

在前端访问效果如下:

Django存储emoji到MySQL

3. 检查客户端和字符集

最后,这第两步是可选的,但强烈建议。在 /etc/my.cnf 配置文件中,你可以设置以下参数:

在数据库端的测试。

<参考>

http://blog.manbolo.com/2014/03/31/using-emojis-in-django-model-fields

 


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!