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

MySQL 中的 utf8 vs utf8mb4 区别

目录

    • 核心区别
    • 详细对比
      • 1. **编码范围不同**
      • 2. **历史背景**
      • 3. **实际影响最明显的场景**
      • 4. **存储空间差异**
      • 5. **性能差异**
    • 关键限制
      • **索引长度限制**
    • 实际使用建议
      • 1. **新项目一律使用utf8mb4**
      • 2. **现有系统迁移步骤**
      • 3. **连接配置**
      • 4. **排序规则选择**
    • 兼容性考虑
      • **向下兼容性**
      • **客户端兼容性**
    • 验证当前设置
    • 总结建议

核心区别

utf8在MySQL中是一个"不完整"的UTF-8实现,而utf8mb4才是真正的UTF-8实现

详细对比

1.编码范围不同

字符集最大字节数支持的Unicode范围备注
utf83字节BMP平面(U+0000 ~ U+FFFF)不支持4字节字符
utf8mb44字节所有Unicode字符(包括Supplementary Planes)完整UTF-8支持

2.历史背景

  • utf8 (utf8mb3): MySQL早期实现的"阉割版"UTF-8
    • 2003年引入,当时认为3字节足够表示所有字符
    • 实际是UTF-8的一个子集,后来更名为utf8mb3
  • utf8mb4: MySQL 5.5.3引入
    • 完整的UTF-8实现
    • “mb4” = “multi-byte 4”

3.实际影响最明显的场景

-- 这些字符在utf8下会出错,在utf8mb4下正常-- 表情符号(Emoji)INSERTINTOusers(name)VALUES('小明😊开心');-- 需要utf8mb4-- 部分生僻汉字INSERTINTOtext(content)VALUES('𠀀𪚥𪚨');-- 需要utf8mb4-- 某些数学符号、音乐符号等INSERTINTOsymbols(symbol)VALUES('𝄞𝄢');-- 需要utf8mb4

4.存储空间差异

-- 创建表对比CREATETABLEtest_utf8(idINT,textVARCHAR(100)CHARACTERSETutf8-- 最大300字节);CREATETABLEtest_utf8mb4(idINT,textVARCHAR(100)CHARACTERSETutf8mb4-- 最大400字节);-- 注意:VARCHAR(100)对于utf8最多存储100个字符(但可能占用最多300字节)-- 对于utf8mb4最多存储100个字符(但可能占用最多400字节)

5.性能差异

方面utf8utf8mb4说明
存储空间较小较大utf8mb4可能多用约33%空间
索引长度较短较长索引长度限制以字节为单位
排序性能稍快稍慢差异通常不明显

关键限制

索引长度限制

-- utf8: 最大索引长度 767字节-- utf8mb4: 最大索引长度 3072字节(MySQL 5.7+)-- 但在早期版本中,InnoDB对utf8mb4的索引限制:-- utf8: VARCHAR(255) 可以建索引 (255×3=765 < 767)-- utf8mb4: VARCHAR(255) 不能建索引 (255×4=1020 > 767)-- 需要改为 VARCHAR(191) (191×4=764 < 767)-- 解决办法:修改innodb_large_prefix设置SETGLOBALinnodb_large_prefix=ON;SETGLOBALinnodb_file_format=Barracuda;

实际使用建议

1.新项目一律使用utf8mb4

-- 数据库级别CREATEDATABASEmydbCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;-- 表级别CREATETABLEmytable(idINTPRIMARYKEY,contentTEXT)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;-- 列级别ALTERTABLEmytableMODIFYcontentVARCHAR(255)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;

2.现有系统迁移步骤

-- 1. 备份数据-- 2. 修改数据库默认字符集ALTERDATABASEdatabase_nameCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;-- 3. 修改表字符集ALTERTABLEtable_nameCONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;-- 4. 修改连接配置-- 在my.cnf中:[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci-- 5. 验证修改SHOWVARIABLESLIKE'character_set%';SHOWVARIABLESLIKE'collation%';

3.连接配置

# 命令行连接mysql -u root -p --default-character-set=utf8mb4# 应用程序连接示例# Python (PyMySQL)conn=pymysql.connect(charset='utf8mb4')# PHP (PDO)$pdo=new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4',$user,$pass);# Java (JDBC)jdbc:mysql://localhost:3306/db?characterEncoding=utf8mb4

4.排序规则选择

-- 常用排序规则utf8mb4_unicode_ci-- 基于Unicode标准排序,支持多语言(推荐)utf8mb4_general_ci-- 旧的排序规则,性能稍好但准确性较差utf8mb4_bin-- 二进制排序,区分大小写和重音utf8mb4_0900_ai_ci-- MySQL 8.0默认,基于Unicode 9.0标准-- 查看所有utf8mb4排序规则SHOWCOLLATIONLIKE'utf8mb4%';

兼容性考虑

向下兼容性

  • utf8mb4完全兼容utf8(utf8mb3)存储的数据
  • 反向不兼容:utf8mb4的数据可能无法在utf8中正常显示

客户端兼容性

  • 所有现代客户端都支持utf8mb4
  • 确保客户端连接时也使用utf8mb4字符集

验证当前设置

-- 查看数据库、表、列的字符集SELECTTABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAMEFROMinformation_schema.COLUMNSWHERETABLE_SCHEMA='your_database'ANDCHARACTER_SET_NAMEISNOTNULL;-- 查看当前连接的字符集SHOWVARIABLESWHEREVariable_nameLIKE'character_set_%'ORVariable_nameLIKE'collation%';

总结建议

  1. 始终使用utf8mb4,不要使用utf8
  2. 排序规则使用utf8mb4_unicode_ci(或MySQL 8.0的utf8mb4_0900_ai_ci)
  3. 注意索引长度限制,必要时调整字段长度
  4. 确保应用程序连接字符串也使用utf8mb4
  5. MySQL 8.0已将utf8mb4作为默认字符集
-- MySQL 8.0默认设置mysql>SELECT@@character_set_database,@@collation_database;+--------------------------+------------------------+|@@character_set_database|@@collation_database|+--------------------------+------------------------+|utf8mb4|utf8mb4_0900_ai_ci|+--------------------------+------------------------+

重要提示:MySQL未来版本中,utf8可能会被重新定义为真正的UTF-8(目前utf8utf8mb3的别名),建议明确使用utf8mb4以避免不确定性。

http://www.jsqmd.com/news/299520/

相关文章:

  • 指针,C语言的灵魂与噩梦:从入门到“放弃”的终极指南 [特殊字符]
  • SAGE-Net:融合语义信息的自动驾驶注意力预测框架
  • Flutter for OpenHarmony:用 StatefulWidget 实现基础用户交互
  • 【读论文】EQ情感智能benchmark:EmoBench
  • YOLO26改进 - 采样 | 小目标分割救星:HWD 降采样少丢细节提精度
  • 【统一功能处理】从入门到源码:拦截器学习指南(含适配器模式深度解读) - 教程
  • 洛谷 P1918:保龄球 ← STL map
  • 详细介绍:C++蓝桥杯之结构体10.15
  • 抖店商品图如何保存到手机上的方法
  • 云端推理中的模型量化技术:减小体积提升速度
  • C++实现ATM状态机
  • 导师严选2026 AI论文工具TOP10:自考论文写作全攻略
  • Java毕设项目推荐-基于SpringBoot的社区公益服务管理平台 基于springboot的社区志愿者服务系统【附源码+文档,调试定制服务】
  • 【计算机毕业设计案例】基于springboot的居民志愿服务智慧系统社区志愿者服务系统(程序+文档+讲解+定制)
  • 学长亲荐8个AI论文平台,助你搞定本科毕业论文!
  • 论文《关于预防人工智能反叛的初步探讨》修订版
  • SMU 2026 ptlks的周报Week 1
  • 2025年少儿编程推荐:五家优选品牌深度全面对比解析
  • 用 CrossOver 体验“魔法世界”:在 Mac 电脑畅玩《霍格沃茨之遗》保姆级教程
  • 2025年少儿编程哪家靠谱?主流上榜五家品牌全面深度解析
  • GLM-ASR-Nano-2512:中文方言识别与低音量语音处理的最佳开源方案
  • 2026年AI智能体替代员工:从理论到实践,小白也能上手的数字员工教程
  • 从入门到精通:RAG系统中检索与生成之间的增强层,收藏级技术指南
  • 【超详细】大模型学习路线图,从入门到应用(建议收藏)
  • 如何系统化的学习金融,投资,理财?
  • 字符串相关
  • 兰亭妙微:以交互与网站设计之力,重塑行业门户新标杆
  • 兰亭妙微:以HTML前端、UI/交互/图标设计赋能数字孪生与大屏设计新标杆
  • 【第三十二周】RAG学习02
  • Lab2-system calls MIT6.1810操作系统工程【持续更新】