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_ci
和utf8mb4_general_ci
:
- 带
unicode
的排序更精准,适合多语言系统 - 带
general
的速度更快,适合对排序要求不高的场景
小编观点
现在新建数据库还选utf8?跟用诺基亚手机没啥区别!别看就多一个字母,关键时刻能救急。特别是做移动端应用的,用户发个生日蛋糕emoji你都存不住,分分钟给你App打一星差评。记住这条铁律:无脑选utf8mb4就对了,省下来的时间够你多喝两杯奶茶了。