问题:
在做webapp项目的时候,用户提交emoji数据,控制台报错:Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'signature' at row 1。
原因:
原mysql数据库的编码格式是utf8,mysql在存储数据的时候用的是3个字节去存储。而emoji表情要用4个字节的utf8,也就是utf8mb4格式。
解决方法:
首先需要修改mysql的配置文件: windows--> my.ini linux-->/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%';
修改完数据库后,创建数据库:
create database database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
在查看django源码中: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中mysql 连接:
在数据库连接配置中增加options项:
'OPTIONS':{'charset':'utf8mb4'},
再次尝试 成功!
对于mysql数据库格式为utf8且已经存在数据的情况:
1、修改mysql 配置文件,重启
2、将数据库编码格式更新为utf8mb4
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
3、再将对应的表编码格式更新为utf8mb4
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4、修改django--settings中mysql连接,增加
'OPTIONS':{'charset':'utf8mb4'},
5、尝试,可成功!