解决SpringBoot Mysql Emoji表情 druid hikari

前言

项目中需要支持Emoji表情,但是尝试了很多办法无果后,结合了多个文章后实现了在Springboot项目中使用mysql数据库存储Emoji表情。

在数据库中存储Emoji需要用utf8mb4编码格式,一般mysql默认的是utf8

解决方案

1.修改表的字符集

1
CREATE DATABASE  `tableName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2.修改字段字符集

1
ALTER TABLE tb_chat MODIFY COLUMN content VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3.修改数据连接
druid:

1
spring.datasource.druid.connection-init-sqls="SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

hikari:

1
spring.datasource.hikari.connection-init-sql="SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

注意

由于从utf8升级到了utf8mb4,一个字符所占用的空间也由3个字节增长到4个字节,但是我们当初创建表时,设置的字段类型以及最大的长度没有改变。例如,你在utf8下设置某一字段的类型为TINYTEXT, 这中字段类型最大可以容纳255字节,三个字节一个字符的情况下可以容纳85个字符,四个字节一个字符的情况下只能容纳63个字符,如果原表中的这个字段的值有一个或多个超过了63个字符,那么转换成utf8mb4字符编码时将转换失败,你必须先将TINYTEXT更改为TEXT等更高容量的类型之后才能继续转换字符编码

在InnoDB引擎中,最大的索引长度为767字节,三个字节一个字符的情况下,索引列的字符长度最大可以达到255,四个字节一个字符的情况下,索引的字符长度最大只能到191。如果你已经存在的表中的索引列的类型为VARCHAR(255)那么转换utf8mb4时同样会转换失败。你需要先将VARCHAR(255)更改为VARCHAR(191)才能继续转换字符编码

总结

要存储Emoji需要utf8mb4字符集,通常不需要修改数据库的字符集,只需要修改表,字段的字符集。然后还需要再数据库session初始化时就将字符集指定为utf8mb4否则就会采用数据库默认字符集,通常是utf8,就会导致无法存入emoji.

参考:
修改MySQL的字符集为utf8mb4