关于MySQL 存储 emoji 字符编码已更改为uft8mb4 仍然 报错问题 ,以及修复后 SQLYog实现计划备份时报错问题
有一个需求 要求可以存储 emoji 表情
可是如果将 前端返回的 字符串 插入数据库便会出现以下报错
Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xF0\x9F\x92\x95' for column 'content' at row 1
一眼便看得出是字符串不支持
mysql数据库的utf8
只能三个字节,而 emoji却有四个,所有无法插入
网上提出两种解决办法:
1. 前端js处理emoji表情,转换字符,当后端返回时再转换回来
2. 更改数据库设计
第一种方法确实复杂,果断第二种
更改数据库设计,因为在MySQL 5.6+
的版本中 已经引入了 utf8mb4
这一字节编码,这种格式的字节编码 已经支持存储 四个字节的字符了,如果对命令提示符不熟可以直接使用图形化界面
但是需要注意的是编码规则不仅仅只是存在于数据库 和 表,列也有自己的编码规则
而且
权重 : 列>表>数据库
顺便将排序规则也更改为 uft8mb4_general_ci
在sqlYog中 更改列的语言规则 是在更改表中 有一个 隐藏语言选项
的复选框 将其勾选,即可出现列的字符集
以及核对
网上的大部分教程都是到了这一步
但我在试验后,仍然发现报错
偶尔发现直接使用语句插入 emoji 是可以的,于是考虑应用层的问题
笔者使用的是nodeJS
果然发现,在mysql.createPool
配置中的 charset
没有配置,
将其配置为 utf8mb4
再次尝试插入果然成功 其他语言请自行查看相关配置
var pool = mysql.createPool({
host: 'localhost',
user:'root',
//charset:'utf8mb4'
});
在问题修复以后 SQLYog 计划备份出现问题
由于笔者有被黑客攻击数据库的经验,所以 对于备份
特别看重 可是当我像往常一样设置了计划备份
之后
在执行时 却出现了如下错误
Can't initialize character set unknown (path: compiled_in)Error in Connection
也是字符串的设置出了问题
考虑 到计划备份时 sql配置文件会对其结果产生影响 于是在 my.ini
中加入以下 代码
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
用于配置基础的编码格式
然后重启mysql服务
尝试重新计划备份 ,备份成功问题解决