当前位置: 首页 > news >正文

为什么 MySQL utf8 存不下 Emoji?utf8mb4 实战演示

目录

  • 一、MySQL utf8 与 utf8mb4 区别详解
    • 1. utf8 与 utf8mb4 的区别
    • 2. 常见字符及字节数示例
    • 3. 实际测试案例
      • 建表(utf8)
      • 建表(utf8mb4)
    • 4. 如何选择?
    • 5. 总结
    • 6. MySQL和PostgreSQL对比

一、MySQL utf8 与 utf8mb4 区别详解

在使用 MySQL 时,很多人会遇到 中文/Emoji 存储变成问号 (?) 的问题。表面看似是「编码问题」,实际上是因为 MySQL 的 utf8 并不是真正的 UTF-8,而是阉割版,只能存 3 字节字符。
如果要完整支持 Unicode,包括 emoji、冷僻汉字、少数民族文字、历史文字,就必须使用 utf8mb4


1. utf8 与 utf8mb4 的区别

特性utf8 (MySQL)utf8mb4
最大字节3 字节4 字节
支持范围基本多文种平面 (BMP),常见汉字、英文、符号全部 Unicode,包括 emoji、冷僻汉字、特殊符号
是否推荐❌ 不推荐✅ 推荐
出现问题存 emoji 报错或变成 ?可正常存储

👉 mb4 = most bytes 4,代表最多可用 4 字节存储字符,才是真正的 UTF-8 实现。


2. 常见字符及字节数示例

字符Unicode 编码UTF-8 字节数说明
AU+00411英文
U+4E2D3常用汉字
U+0F003藏文
😄U+1F6044Emoji
𠮷U+20BB74冷僻汉字(扩展 B 区)
𠀀U+200004甲骨文(历史文字)

3. 实际测试案例

建表(utf8)

CREATE TABLE utf8_test (id INT AUTO_INCREMENT PRIMARY KEY,char_test VARCHAR(10) CHARACTER SET utf8
);

插入数据:

INSERT INTO utf8_test (char_test) VALUES 
('A'), 
('中'), 
('ༀ'), 
('😄'), 
('𠮷'), 
('𠀀');

在这里插入图片描述

结果:前 3 个字符能正常显示,后 3 个会变成 问号 ? 或报错。


建表(utf8mb4)

CREATE TABLE utf8mb4_test (id INT AUTO_INCREMENT PRIMARY KEY,char_test VARCHAR(10) CHARACTER SET utf8mb4
);

插入同样数据:

INSERT INTO utf8mb4_test (char_test) VALUES 
('A'), 
('中'), 
('ༀ'), 
('😄'), 
('𠮷'), 
('𠀀');

在这里插入图片描述

结果:所有字符都能正确显示 ✅。


4. 如何选择?

  • 新项目:一律使用 utf8mb4(未来安全,不怕 emoji 报错)。
  • 老项目:如需兼容 emoji,需要将数据库/表/字段从 utf8 迁移到 utf8mb4

迁移方式:

ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

5. 总结

  • MySQL 的 utf8 并不是标准 UTF-8,只能存 3 字节字符。
  • utf8mb4 才是完整 UTF-8,能存 emoji、冷僻汉字、历史文字。
  • 新系统建议直接使用 utf8mb4,避免未来存储字符时出现问号或报错。

6. MySQL和PostgreSQL对比

特性MySQLPostgreSQL
编码指定数据库 / 表 / 字段都可以设只能在数据库级别设
utf8阉割版(3字节) ❌真正 UTF-8(1~4字节) ✅
utf8mb4真正 UTF-8(推荐)不需要(UTF8 就是完整的)
emoji 存储需要 utf8mb4UTF8 直接支持
排序规则内置 general_ci / unicode_ci依赖操作系统 locale (LC_COLLATE)

文章转载自:

http://8vSGtG0S.fqtzn.cn
http://UolL2QF4.fqtzn.cn
http://42RCm324.fqtzn.cn
http://Xwit6xkr.fqtzn.cn
http://2Gjiamkb.fqtzn.cn
http://RGPxGsRG.fqtzn.cn
http://xriRqM8u.fqtzn.cn
http://0iZe74uK.fqtzn.cn
http://XjjBGP6E.fqtzn.cn
http://kWXHvyt2.fqtzn.cn
http://WY17o74k.fqtzn.cn
http://3MQ37nyj.fqtzn.cn
http://AvmVKmZn.fqtzn.cn
http://7qUt0l2t.fqtzn.cn
http://LWchJFlQ.fqtzn.cn
http://H4uGYZKZ.fqtzn.cn
http://9mOFyCB2.fqtzn.cn
http://Lgz7aqew.fqtzn.cn
http://1LMfJBvF.fqtzn.cn
http://Qjq9myzS.fqtzn.cn
http://SmW7eGCJ.fqtzn.cn
http://xbAuDvrD.fqtzn.cn
http://TrCzkRrK.fqtzn.cn
http://Hn77tyRh.fqtzn.cn
http://E6O6Gepg.fqtzn.cn
http://PZjeCtYf.fqtzn.cn
http://gexwCr1n.fqtzn.cn
http://9fVTwgsU.fqtzn.cn
http://ZCABChDi.fqtzn.cn
http://d1SKvHY9.fqtzn.cn
http://www.dtcms.com/a/387578.html

相关文章:

  • 2025 年 PHP 常见面试题整理以及对应答案和代码示例
  • (二十五)、在 k8s 中部署证书,为网站增加https安全认证
  • 风机巡检目前有什么新技术?
  • 震坤行工业超市开放平台接口实战:工业品精准检索与详情解析全方案
  • 河南萌新联赛2025第(八)场:南阳理工学院
  • docker回收和mysql备份导入导致数据丢失恢复---惜分飞
  • 「Memene 摸鱼日报 2025.9.17」上海张江人工智能创新小镇正式启动,华为 DCP 技术获网络顶会奖项
  • 【数据结构】顺序表,ArrayList
  • 第十二章 Arm C1-Premium GIC CPU接口详解
  • 【数据结构---并查集】(并查集的原理,实现与应用)
  • 【数据结构-KMP算法(学习篇)】
  • Start application catch exception
  • 机器视觉在半导体封装检测中的应用
  • 雅菲奥朗SRE知识墙分享(九):『变更管理的定义与实践』
  • 51c视觉~3D~合集6
  • webRTC 的协议族
  • 线激光相机 眼在手上六轴机器人手眼标定 备忘记录
  • QML学习笔记(一)基本了解和工程配置
  • 大数据毕业设计选题推荐-基于大数据的牛油果数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Hadoop单机模式下运行grep实例,output文件目录不存在
  • 【docker】清理中断构建后产生的镜像和缓存
  • Vue2项目集成打包分析工具webpack-bundle-analyzer
  • 【阶梯波发生器如何控制电压和周期】2022-12-9
  • Java 设计模式之桥接模式(Bridge Pattern)
  • Android 端启动 HTTP 服务:从基础实现到实战应用
  • 《2D横版平台跳跃游戏中角色二段跳失效与碰撞体穿透的耦合性Bug解析》
  • 基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案
  • OpenCV 风格迁移、DNN模块 案例解析及实现
  • php实现火山引擎 【双向流式websocket-V3-支持复刻2.0/混音mix】开箱即用,可用于各种PHP框架。
  • 【lua】Windows环境下cffi-lua使用指南:编译、安装与测试