前言
项目中需要支持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.