news 2026/4/18 8:07:10

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/3/30 8:59:34

本地运行!开源AI音乐生成器HeartMuLa完整安装与使用指南

HeartMuLa是一个开源的本地离线AI音乐生成器&#xff0c;包含音乐语言模型、编解码器、歌词转录模型和音频-文本对齐模型。支持多语言输入歌词和标签生成完整音乐&#xff0c;无需依赖云端&#xff0c;不限使用次数。文章提供了详细的环境准备、本地部署、命令行和ComfyUI可视化…

作者头像 李华
网站建设 2026/4/13 12:49:03

计算机Java毕设实战-基于springboot的社会养老平台的设计与实现基于SpringBoot+Vue的智慧养老服务平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 8:00:15

从零开始学Word2Vec:小白到大模型的入门教程

本文详细介绍了Word2Vec技术&#xff0c;包括其基本概念、Skip-Gram和CBOW两种模型与架构。文章指导读者如何从数据收集、预处理到训练自己的Word2Vec模型&#xff0c;并提供了评估方法。同时分析了Word2Vec的优缺点及其在文本相似度计算、情感分析等领域的应用&#xff0c;为N…

作者头像 李华