Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL中utf8与utf8mb4区别

MySQL中的utf8与utf8mb4区别详细对比总结

作者:翔云123456

utf8mb4和utf8是MySQL中两种常用的字符集,它们都可以用来存储Unicode字符,但是有一些区别和联系,这篇文章主要介绍了MySQL中utf8与utf8mb4区别详细对比总结的相关资料,需要的朋友可以参考下

核心区别

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

详细对比

1.编码范围不同

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

2.历史背景

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

-- 这些字符在utf8下会出错,在utf8mb4下正常
-- 表情符号(Emoji)
INSERT INTO users (name) VALUES ('小明😊开心');  -- 需要utf8mb4

-- 部分生僻汉字
INSERT INTO text (content) VALUES ('𠀀𪚥𪚨');  -- 需要utf8mb4

-- 某些数学符号、音乐符号等
INSERT INTO symbols (symbol) VALUES ('𝄞𝄢');  -- 需要utf8mb4

4.存储空间差异

-- 创建表对比
CREATE TABLE test_utf8 (
    id INT,
    text VARCHAR(100) CHARACTER SET utf8  -- 最大300字节
);

CREATE TABLE test_utf8mb4 (
    id INT,
    text VARCHAR(100) CHARACTER SET utf8mb4  -- 最大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设置
SET GLOBAL innodb_large_prefix = ON;
SET GLOBAL innodb_file_format = Barracuda;

实际使用建议

1.新项目一律使用utf8mb4

-- 数据库级别
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 表级别
CREATE TABLE mytable (
    id INT PRIMARY KEY,
    content TEXT
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 列级别
ALTER TABLE mytable MODIFY content VARCHAR(255) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2.现有系统迁移步骤

-- 1. 备份数据
-- 2. 修改数据库默认字符集
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 3. 修改表字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_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. 验证修改
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE '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排序规则
SHOW COLLATION LIKE 'utf8mb4%';

兼容性考虑

向下兼容性

客户端兼容性

验证当前设置

-- 查看数据库、表、列的字符集
SELECT 
    TABLE_SCHEMA,
    TABLE_NAME,
    COLUMN_NAME,
    CHARACTER_SET_NAME,
    COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'your_database'
  AND CHARACTER_SET_NAME IS NOT NULL;

-- 查看当前连接的字符集
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE '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以避免不确定性。

总结

到此这篇关于MySQL中utf8与utf8mb4区别详细对比总结的文章就介绍到这了,更多相关MySQL中utf8与utf8mb4区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文