注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

Django存储emoji到MySQL

MySQL 彭东稳 117次浏览 未收录 0个评论

一、问题描述

目前来说,多数 MySQL 都是以 utf8 存储,注意 MySQL 的 utf8 和我们所说的传统 utf8 有点区别。MySQL 的 utf8 编码规定了最多只能有 3 个字节,而 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)or分享 (0)
关于作者:

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