前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谨记不要在MySQL中使用“utf8”编码

谨记不要在MySQL中使用“utf8”编码

作者头像
Dream城堡
发布2022-05-10 10:42:42
1.1K0
发布2022-05-10 10:42:42
举报
文章被收录于专栏:Spring相关Spring相关

谨记不要在MySQL中使用“utf8”编码

掉坑回顾: 最近在工作中遇到一个BUG,用于记录客户昵称的数据表,在插入带有表情的字符时候报错.使用的存储引擎是INNODB,当我查看数据库字段的时候确实是设置的utf8,我传入的字符也是utf8的编码集,这有什么错?直到我深入了解才发自己使用的姿势并不对,mysql数据库中的"utf8"并不是真正的utf8编码,关于这个问题mysql官方一直未能修复,取而代之的推出了utf8mb4,这一点让我记忆犹新,切记mysql中不要再使用utf8编码!

1.BUG重现

这里我做了一个简单的试验,来验证utf8在mysql中存在的问题:

建立数据表:

代码语言:javascript
复制
CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `nickname` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '昵称',
  `sex` varchar(255) DEFAULT NULL COMMENT '性别',
  `age` int(10) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='测试utf8问题重现'

这里我们直接指定了nickname字段的字符编码为utf8,然后我向里面插入一条普通数据,使用mybatis的插入数据库语句如下:

代码语言:javascript
复制
INSERT INTO  `user` ( `nickname`, `sex`, `age`) VALUES ( '张三', '男', '18');
12057079-dee58d7eda3db18f.png
12057079-dee58d7eda3db18f.png

的确是像我们平时操作一样插入成功了,似乎没有什么问题,但这里我们再测试一下昵称中带有表情符(emoji)的数据尝试一下:

张三 An 😀awesome 😃string 😄with a few 😉emojis!

代码语言:javascript
复制
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80aw...' for column 'nickname' at row 1

这个时候报的错误就很明显是指的这个表情符无法存入该字段,那为什么emoji无法存入utf8编码的字段呢,这又是怎么回事呢?

2.Mysql遗留问题

这个问题的症结在于,Mysql的"utf8"并不是真正的UTF-8.

“utf8”只支持每个字符三个字节,而真正的 UTF-8 是每个字符最多四字节,MySQL 一直没有修复这个 bug,他们在 2010 年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题,但为什么没有修复"utf8"问题?具体原因不详.

简单归纳综合如下: MySQL 的“utf8mb4”是真正的“UTF-8”,MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符其实不多,所以在使用mysql的时候还是用"utf8mb4"的编码集恰当!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 谨记不要在MySQL中使用“utf8”编码
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档