前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django,mysql存储emoji表情,utf8mb4

django,mysql存储emoji表情,utf8mb4

作者头像
Bob.Chen
发布2018-05-02 14:04:48
2.1K0
发布2018-05-02 14:04:48
举报

今天在做后台的时候发现一个错误: Incorrect string value: '\xF0\x9F\x90\xA8' for column 'signature' at row 1

发现是参数里面是一个iOS的表情,也就是系统自带的emoji表情。 后台用的是django 1.6,数据库用的是Mysql 5.5.22,缓存用的是redis。

上网了解了一下emoji表情,原来一般的字符包括中文用utf8的话,mysql是用3个字节去存储的,而emoji表情要用4个字节的utf8,也就是utf8mb4格式。

首先更改mysql的数据编码,修改mysql的配置文件:/etc/mysql/my.cnf 添加:

代码语言:javascript
复制
[client]  
default-character-set = utf8mb4  

[mysql]  
default-character-set = utf8mb4  

[mysqld]  
character-set-client-handshake = FALSE  
character-set-server = utf8mb4  
collation-server = utf8mb4_unicode_ci 

然后重启mysql,查看mysql的编码 SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

代码语言:javascript
复制
+--------------------------+----------------------------+  
| Variable_name            | Value                      |  
+--------------------------+----------------------------+  
| character_set_client     | utf8mb4                    |  
| character_set_connection | utf8mb4                    |  
| character_set_database   | utf8mb4                    |  
| character_set_filesystem | binary                     |  
| character_set_results    | utf8mb4                    |  
| character_set_server     | utf8mb4                    |  
| character_set_system     | utf8                       |  
| character_sets_dir       | /usr/share/mysql/charsets/ |  
| collation_connection     | utf8mb4_unicode_ci         |  
| collation_database       | utf8mb4_unicode_ci         |  
| collation_server         | utf8mb4_unicode_ci         |  
+--------------------------+----------------------------+ 

OK,mysql改完了,然后创建数据库: create database xxx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

创建数据库之后是syncdb,这时 MySQLdb模块 需要1.2.4以上版本,关于MySQLdb模块的安装可以参考这篇文章,最新版是1.2.5 syncdb成功之后,再次尝试插入,还是报错。 查看了一下这部分的源代码,发现django/db/backends/mysql/base.py中的DatabaseWrapper类中有个kwargs的属性,里面有个key叫charset,默认值是utf8,后面做数据库连接的时候,会用django的settings.py中,database的options去更新这一项。

代码语言:javascript
复制
class DatabaseWrapper(BaseDatabaseWrapper):  

    def get_connection_params(self):  
        kwargs = {  
            'conv': django_conversions,  
            'charset': 'utf8',  
        } 

那么我们修改一下django的settings.py,在数据库的配置中加入options项。

代码语言:javascript
复制
DATABASES = {  
    'default': {  
        #'ENGINE': 'sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.  
        'ENGINE': 'django.db.backends.mysql',  
        #'NAME': '/opt/media/session.db',                      # Or path to database file if using sqlite3.  
        'NAME': DATABASE_NAME,  
        'USER': 'root',                      # Not used with sqlite3.  
        'PASSWORD': DATABASE_PASSWORD,                  # Not used with sqlite3.  
        'HOST': DATABASE_HOST,                      # Set to empty string for localhost. Not used with sqlite3.  
        'PORT': DATABASE_PORT,                      # Set to empty string for default. Not used with sqlite3.  
       'OPTIONS': {'charset':'utf8mb4'}, 
    },  
}

主要是这句'OPTIONS': {'charset':'utf8mb4'} 然后再尝试插入emoji表情,结果正常,取出来结果也正常,ios和android都可以正常使用。 由于实际在阿里云上部署的时候,mysql使用的是docker container,似乎不方便修改container里面的mysql配置文件(进去container,里面没有vi),尝试不改配置文件,只是在创建数据库的时候指定character set 为utf8mb4,collate为 utf8mb4_unicode_ci,发现其实也可以用,那么应该是只需要保证连接mysql的时候是用utf8mb4,并且mysql数据的编码格式是utf8mb4即可。

网上有更完整的关于存储emoji表情到mysql的例子可以参考:http://blog.manbolo.com/2014/03/31/using-emojis-in-django-model-fields

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档