Django1.10+Mysql 5.7存储emoji表情,报Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'signature' at row 1的解决方法

时间:2022-10-13 20:12:45

问题:

  在做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、尝试,可成功!