MySQL中的utf8和utf8mb4有什么区别?详探MySQL中utf8与utf8mb4编码的区别与选择

有没有试过在数据库里存了个笑脸emoji,结果系统直接报错?或者明明网页显示正常,导出的数据却出现一堆问号?这八成是栽在字符集的坑里了。今天咱们就来掰扯掰扯MySQL里这对双胞胎字符集——​​utf8​​和​​utf8mb4​​,保你看完就知道怎么躲开这些隐藏的雷区。


一、这两个家伙到底啥来头?

当年程序员老哥们设计MySQL时,想着用​​utf8​​就能搞定所有文字。谁知道后来冒出来一堆emoji表情、生僻汉字,这些字符得用4个字节才能存。可​​utf8​​最多只支持3个字节,就像你拿个只能装3斤米的袋子去装5斤米,结果自然是撒一地。

这时候​​utf8mb4​​闪亮登场了,名字里的"mb4"就是"最多4个字节"的意思。好比给你换了个能装10斤米的大麻袋,管你是火星文还是颜文字,统统往里塞就完事。

举个实在的例子:

  • 存个普通汉字"你",用​​utf8​​和​​utf8mb4​​都要花3个字节
  • 要是存个笑脸emoji "",​​utf8​​直接 *** 报错,​​utf8mb4​​就能用4个字节妥妥存好

二、选错字符 *** 发生啥?

前阵子有个做社交APP的朋友就踩了坑。用户发的动态里带emoji,结果存进数据库全变成乱码。最后排查发现用的是​​utf8​​,改完字符集还得手动修复上万条数据,肠子都悔青了。

这里有个特别容易中招的点:建表时选​​utf8​​,字段长度看着够用,实际可能超限。比如你设了varchar(100)

  • 存100个普通汉字需要300字节,刚好达标
  • 要是有50个emoji,得用200字节,直接翻倍超限

三、具体该咋选?

先看这个对比清单:

​对比项​​utf8​​utf8mb4​
支持字符基本文字所有Unicode字符
每个字最大字节数3个4个
存储空间省地方稍微费点地方
适用场景纯文字论坛社交/电商/国际化系统

可能你会觉得,哎呀存储空间会不会爆炸啊?其实现在硬盘这么便宜,多占的那点空间根本不算事。实测存10万条带emoji的评论,​​utf8mb4​​也就比​​utf8​​多占5%空间,但换来的是再也不用担心用户发奇怪符号了。


四、新手必问三连击

​Q:已经用着utf8怎么办?​
直接执行这条命令就能改:

sql复制
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4;

记得备份数据!改完检查下字段长度够不够用。

​Q:前端显示正常,导出数据却乱码?​
八成是数据库连接没设对。在配置文件里加这两行:

[client]default-character-set = utf8mb4

就跟WiFi密码输错一个道理,配置对不上就全乱套。

​Q:排序规则那一堆_ci是啥意思?​
比如utf8mb4_unicode_ciutf8mb4_general_ci

  • unicode的排序更精准,适合多语言系统
  • general的速度更快,适合对排序要求不高的场景

小编观点

现在新建数据库还选​​utf8​​?跟用诺基亚手机没啥区别!别看就多一个字母,关键时刻能救急。特别是做移动端应用的,用户发个生日蛋糕emoji你都存不住,分分钟给你App打一星差评。记住这条铁律:​​无脑选utf8mb4就对了​​,省下来的时间够你多喝两杯奶茶了。