django,mysql存储emoji表情,utf8mb4
来源:互联网 发布:内蒙古云计算基地 编辑:程序博客网 时间:2024/06/05 19:50
今天在做后台的时候发现一个错误:
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 = FALSEcharacter-set-server = utf8mb4collation-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改完了,然后创建数据库:
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中,database的options去更新这一项。
class DatabaseWrapper(BaseDatabaseWrapper): def get_connection_params(self): kwargs = { 'conv': django_conversions, 'charset': 'utf8', }
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'}, },}
然后再尝试插入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
- django,mysql存储emoji表情,utf8mb4
- mysql存储emoji表情,utf8mb4
- MySQL utf8mb4 字符集,用于存储emoji表情
- MySQL utf8mb4 字符集,用于存储emoji表情
- MySQL utf8mb4 字符集,用于存储emoji表情
- mysql utf8mb4与emoji表情
- mysql 存emoji表情 utf8mb4
- mysql存储emoji表情(utf8mb4编码)报错
- Mysql新增UTF8MB4编码支持emoji表情
- 升级 MySql 支持 emoji 表情 与 utf8mb4
- mysql存储emoji表情
- Mysql存储emoji表情
- mysql存储emoji表情
- Mysql存储emoji表情
- Django+mysql支持emoji表情
- 让MySql支持Emoji表情 utf8mb4编码格式
- mysql中的utf8mb4,可以支持Emoji表情的编码格式
- mysql emoji表情 保存utf8mb4 错误原因总结
- Android音频系统之二音频框架
- ios身份证号码判断
- c# 数据类型占用的字节数
- Revise .profile and install pip.
- 一个很不错的博客,说了很多图形学的基础知识
- django,mysql存储emoji表情,utf8mb4
- @property关键字和参数详解
- c++实现aes加密算法,对字符串进行加密
- c++ const成员函数的纠结
- 技术团队的聚散离合--案例故事,献给曾经的团队
- P1034 家族
- 2015 for me it can be change改变自己
- 一个IT从业者2014的改变和思考
- 登录界面中的textbox提示字段的实现