django,mysql存储emoji表情,utf8mb4

今天在做后台的时候发现一个错误:

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 添加:

[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%‘;
+--------------------------+----------------------------+
| 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改完了,然后创建数据库:

<span style="font-family:SimSun;font-size:12px;">create database xxx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;</span>

创建数据库之后是syncdb,这时 MySQLdb模块 需要1.2.4以上版本,关于MySQLdb模块的安装可以参考这篇文章,最新版是1.2.5

syncdb成功之后,再次尝试插入,还是报错。

查看了一下这部分的源代码,发现django/db/backends/mysql/base.py中的DatabaseWrapper类中有个kwargs的属性,里面有个key叫charset,默认值是utf8,后面做数据库连接的时候,会用django的settings中,database的options去更新这一项。

class DatabaseWrapper(BaseDatabaseWrapper):

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

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

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.
        <span style="color:#ff0000;">'OPTIONS': {'charset':'utf8mb4'},</span>
    },
}

然后再尝试插入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

时间: 2024-10-25 19:00:43

django,mysql存储emoji表情,utf8mb4的相关文章

Mysql存储emoji表情的两种方式

最近在做数据迁移,原先有一个字段的类型为clob,迁移后的字段类型为varchar,blob转化成字符串数据后,发现有emoji表情存在,导致数据迁移失败.失败的原因是mysql数据库中设置的utf-8类型是3个字节,而emoji表情的utf-8是4个字节,所以无法传入. 要使mysql能存储emoji表情,需要数据库的版本在5.5以上. 为了解决问题,主要有两种方式: 第一种方式是修改字段的编码. 第二种方式是修改配置文件. 第一种方式:亲测可用 1)修改对应表字段的编码类型 ALTER TA

mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】

utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at com.mysql.jdbc.SQLError.createSQLException(

mysql存储emoji表情

微信获取的用户昵称nickname中带有emoji表情,转换成字符码后是这种形式“\xF0\x9F\x91\x8D\xE6\x94...”, 直接保存可能出现以下错误 Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:

Java在mysql中存储emoji表情

mysql存储emoji表情要使用utf8mb4字符集,这是4字节存储,最低支持版本为5.5.3+,若不是,请升级到较新版本. 修改mysql配置文件 Window目录: mysql/my.ini Ubuntu16.04目录: /etc/mysql/conf.d/mysql.cnf  配置Client /etc/mysql/mysql.conf.d/mysql.cnf  配置Server 其他目录: 一般在etc/mysql/my.cnf 在mysql配置文件添加以下三部分内容: [client

Mysql数据库存储emoji表情

emoji表情需要使用编码格式未utf8mb4,mysql数据库版本要5.5以上,我用的是5.6,因为只有5.5以上支持utf8mb4. 1.数据库编码设定为utf8mb4,如果建库时指定的是utf8,则需要执行语句:ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 2.同时指定数据库配置参数中character_set_server改为utf8mb4 3.把对应的需要保存emoj

【Mysql】存储emoji表情报错(Incorrect string value: &#39;\xF0\x9F\x98\x82\xF0\x9F...&#39;)的解决方案

普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题.涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点 Mysql 版本的限制,Mysql 5.5.3之前的版本,支持的utf8为3字节的,Mysql 5.5.3之后的版本支持utf8mb4 修改mysql的配置文件,windows下的为my

mysql保存emoji表情(微信开发用户昵称..)

  java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) at com.mysql.jdbc.MysqlIO.

mysql支持emoji表情上传

背景: 由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储 mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情.但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储.但是在mysql5.5之前并不支持utf8mb4编码,所以mysql一定要在5.5及以上 1.首先修改mysql配置文件 1 [mysqld] 2 character-set-client-handshak

让MySQL支持Emoji表情 mysql 5.6

让MySQL支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集. mysql 版本 5.6 1 解决方案:将Mysql的编码从utf8转换成utf8mb4. 需要 >= MySQL 5.5.3版本.从库也必须是5.5的了.低版本不支持这个字符集.复制报错 2 my.cnf 文件添加 [mysqld]  character-set-server = utf8mb4  collation-server = utf8mb4_unicode_ci  init_c