文章 39
评论 3
浏览 167141
【Mysql】表情字符无法存储,修改字符集遇到的问题

【Mysql】表情字符无法存储,修改字符集遇到的问题

最近遇到mysql varchar字段,插入数据报错。

Caused by: java.sql.SQLException: Incorrect string value:'\xE5\x8D\xA1\xE5......' for column 'page_title' at row 1

这个错误是由于字符集的问题导致的,表字段的字符集是utf8,改成utf8mb4 就可以了。

utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。utf8mb4是utf8的超集。

utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。
三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码),和很多不常用的汉字等。

于是可以通过修改报错字段的字符集来解决问题。

  • 单独修改字段的编码:
ALTER TABLE `tableName` CHANGE `page_title` `page_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '页面标题';
  • 修改表的默认字符集,以及所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8mb4;
  • 修改表的默认字符集。所有已存在字符列(CHAR,VARCHAR,TEXT)不会变为新的字符集,依然保持原有字符集。修改字符集后,新建字符型字段,才会采用新的字符集。
ALTER TABLE `tableName` CHARACTER SET = utf8mb4;

仅修改表默认字符集方式补充:表的默认字符集,以前是utf8,但改成utf8mb4 后,由于已有字段的字符集不会改变,还是utf8,所以建表语句在修改默认字符集后,字段会自动声明以前的字符集,建表语句会变成,已有字段会特别声明字符集还是以前的,如:

`page_title` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '页面标题',

标题:【Mysql】表情字符无法存储,修改字符集遇到的问题
作者:T-Aoker
地址:https://aoaos.top/articles/2021/10/27/1635303770681.html

修仙猿之旅

取消