MySQL 从 4.1 版本开始支持 UTF-8,也就是 2003 年,然而目前流行的UTF-8 标准(RFC 3629)是在此以后规定的。正所以,才造就了MySQL中的UTF-8与咱们平常开发中的UTF-8不一致,从到致使了些问题。MySQL的UTF-8只支持每一个字符最多三个字节,而真正的 UTF-8 是每一个字符最多四个字节。java
有数据库表以下:utf8编码方式数据库
往数据库存一条记录:编码
@Test
public void testInsert() {
User user = new User();
user.setUsername("\uD83D\uDE00 ");
user.setPassword("123456");
userRepo.save(user);
}
复制代码
这里只是部分代码,看不懂不要紧,这里是给user表插入一条记录。其中username是\uD83D\uDE00 。spa
其实\uD83D\uDE00是一个emoji表情。code
由于MySQL中utf8字符集只支持三字节UTF-8编码的Unicode范围,而emoji字符属于四字节编码部分,因此程序运行预期是会报错的。运行这段代码:cdn
与预期一致,报错了。blog
虽然MySQL的UTF-8存在缺陷,可是MySQL(包括mariadb)官方却没有修复此bug,而是经过2010年从新发布的“utf8mb4”来支持真正的 UTF-8。所以想要解决此问题,只可以将MySQL数据库设置为utf8mb4字符集才行。开发
这个问题,也是由于某次保存数据的时候保存了一个emoji表情才发现的。其实最先开始用MySQL的时候,就有发现一个utf8mb4了,可是本身却没有却去了解UTF8和UTF8MB4的区别。经过这次教训,之后使用MySQL就老老实实的设置字符集为utf8mb4吧。string