news 2026/9/7 7:03:44

MySQL 中的 utf8 vs utf8mb4 区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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以避免不确定性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 10:52:20

如何系统化的学习金融,投资,理财?

系统化学习金融、投资、理财&#xff0c;需要遵循 “搭建知识框架→夯实理论基础→实践验证迭代→优化思维体系” 的逻辑路径&#xff0c;三者环环相扣&#xff0c;缺一不可。以下是分阶段的详细学习方案&#xff0c;兼顾理论深度与实操性&#xff1a;一、 第一阶段&#xff1a…

作者头像 李华
网站建设 2026/9/4 4:32:59

传统ChatBot四大瓶颈与AgenticRAG完整认知闭环:工业级开发实践

传统ChatBot因架构认知局限难以实现生产级可靠性。AgenticRAG通过理解推理验证实现完整认知闭环&#xff0c;Agent作为AI应用层操作系统决定应用可靠性与复杂度上限。深蓝学院开设工业级RAG系统与Agent应用开发实战课程&#xff0c;由商汤科技专家授课&#xff0c;帮助学员从Pr…

作者头像 李华
网站建设 2026/8/21 14:07:27

【柔性作业车间调度问题FJSP】基于部落竞争与成员合作算法CTCM求解柔性作业车间调度问题(FJSP)研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/9/4 11:46:26

SpringBoot - yml配置文件

SpringBoot使用一个全局配置文件&#xff0c;配置文件名固定&#xff1a; application.propertiesapplication.yml application.properties端口设置8081&#xff0c;application.yml端口设置8082&#xff0c;运行启动类&#xff0c;优先走8081。 两个配置文件互补&#xff0c;a…

作者头像 李华