Mysql 字符串编码报错求助:Incorrect string value

用户输入 emoji 表情时后端就报错:

Cause: java.sql.SQLException: Incorrect string value: '' for column 'content' at row 1

啥原因呢?求解。。。

mysql
77 views
Comments
登录后评论
Sign In
·

小白问题~mysql 默认编码只支持 BMP(基本多文平面)不包含 emoji 等特殊字符,也就是 utf8mb3,你查下命令,数据库编码改为 utf8mb4 就可以了

·

理论上 UTF-8 使用1~6个字节进行存储,但比较新的 UTF-8 规范只使用 1~4 个字节

基本多文平面(BMP): 三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法用三字节编码存储。

不在 BMP 中的字符: Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上)、不常用的汉字、新增的 Unicode 字符等等。

utf8: 等同于utf8mb3,低版本mysql的默认存储格式,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。如上述的Emoji表情

utf8mb4: MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的 utf8 编码读取产生任何问题。

可以用 alter 命令解决:

# 修改相应表
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 设置默认编码
ALTER TABLE logtest DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 只修改部分字段编码
ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果还是报错,可以修改数据库编码方式:

# 查看编码
show variables like '%char%';

# set names进行设置改变三个参数
# character_set_client
# character_set_connection
# character_set_results
set names utf8mb4;

# 或者使用下面命令一个一个更改
set character_set_client = 'utf8mb4';
set character_set_connection = 'utf8mb4';
set character_set_databse = 'utf8mb4';
set character_set_results = 'utf8mb4';

其中 character_set_server 无法通过命令修改,需要修改 mysql 配置文件,然后重启 mysql 才能生效。

grin 以前记录的笔记,抄给你

·

用过几次,不用了,自己写简单的用 markdown,复杂排版用 latex,放 github,随时随地都可以拉下来写笔记,随时同步,git 版本管理