Django1.10+Mysql 5.7存储emoji表情,报Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'signature' at row 1的解决方法
问题:
在做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、尝试,可成功!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 从零开始:基于 PyTorch 的图像分类模型
· [WPF] 在RichTextBox中输出Microsoft.Extension.Logging库的
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1