为什么不要在MySQL中使用UTF-8编码方式
MySQL的UTF-8编码方式
MySQL 从 4.1 版本开始支持 UTF-8,也就是 2003 年,然而目前流行的UTF-8 标准(RFC 3629)是在此之后规定的。正因此,才造就了MySQL中的UTF-8与我们日常开发中的UTF-8不一致,从到导致了些问题。MySQL的UTF-8只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。
问题复现
有数据库表如下:utf8编码方式
往数据库存一条记录:
@Test
public void testInsert() {
User user = new User();
user.setUsername("\uD83D\uDE00 ");
user.setPassword("123456");
userRepo.save(user);
}
这里只是部分代码,看不懂没关系,这里是给user表插入一条记录。其中username是\uD83D\uDE00 。
其实\uD83D\uDE00是一个emoji表情。
因为MySQL中utf8字符集只支持三字节UTF-8编码的Unicode范围,而emoji字符属于四字节编码部分,所以程序运行预期是会报错的。运行这段代码:
与预期一致,报错了。
解决问题
虽然MySQL的UTF-8存在缺陷,但是MySQL(包括mariadb)官方却没有修复此bug,而是通过2010年重新发布的“utf8mb4”来支持真正的 UTF-8。因此想要解决此问题,只能够将MySQL数据库设置为utf8mb4字符集才行。
总结
这个问题,也是因为某次保存数据的时候保存了一个emoji表情才发现的。其实最早开始用MySQL的时候,就有发现一个utf8mb4了,但是自己却没有却去了解UTF8和UTF8MB4的区别。通过此次教训,以后使用MySQL就老老实实的设置字符集为utf8mb4吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】