编码、字符集编码、UTF8mb3/UTF8mb4

本文深入探讨了计算机中字符串的字节表示,从ASCII、ISO8859-1到GB2312、GBK,再到Unicode的实现UTF8。详细介绍了各编码的字节数和覆盖字符范围,特别提到了MySQL中UTF8和UTF8mb4的区别。

编码

        说到底,字符串在计算机上的体现就是一个字节串
        1.ASCII                       1Byte
        2.ISO 8859-1/ latin      1Byte
        3.GB2312                     2Byte
        4.GBK                         2Byte
        5.UTF8/utf8mb3          3Byte
        6.UTF8mb4                 4Byte

        ASCII字符集包含128个字符,在[0-127]这个区间内

        ISO 8859-1是对ASCII字符集的扩充包含256个字符,包含西欧的一些国家如:德、法...,它有一个别名 latin

        GB2312,GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。GB2312编码共收录汉字6763个,其中一级汉字3755个,二级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字....

        GBK则是对GB2312的扩充

        UTF8是遵循Unicode编码的一种实现,用1~4个字节表示一个字符,在Mysql中对UTF8做了阉割的版本就是UTF8(UTF8mb3)字符集,而Mysql中真正的UTF8编码则是UTF8mb4字符集。

<think>嗯,用户询问的是MySQL中utf8字符集是否等同于utf8mb3,这是一个关于数据库字符集的具体技术问题。从用户引用的资料来看,ta已经查阅了一些文档(引用1-3),但需要官方确认。 用户可能正在处理数据库迁移或字符兼容性问题,表情符号或生僻字存储失败是常见触发场景。ta的提问非常精准,说明具备基础数据库知识,但可能被MySQL的历史命名混淆了。需要明确三点: 1)历史命名陷阱:引用2提到"utf8"是遗留术语,这与MySQL官方文档一致 2)技术等价性:引用1明确指出utf8utf8mb3的别名 3)升级风险:引用3强调转换时需要检查索引长度,用户可能隐含后续操作需求 考虑到用户引用中特别提到"阉割版UTF-8"这种形象说法,回复时可以强调其局限性,但需保持客观。补充两点用户可能需要的延伸信息:性能差异(mb4增加约2%存储)和版本差异(MySQL8.0默认改为mb4)。 需要警惕的是:用户引用的第三篇材料提到索引长度限制,这可能是ta真正的痛点。回复时要突出"无法存储四字节字符"这个核心缺陷,并埋下关于索引调整的伏笔——虽然用户当前没问,但后续极可能遇到。 </think>是的,在 MySQL 中,**字符集 `utf8` 实际上等同于 `utf8mb3`**。这是 MySQL 中的一个历史遗留命名。 以下是关键点说明: 1. **官方定义**: * `utf8` / `utf8mb3`:这是 MySQL 早期实现的“不完整”的 UTF-8 编码。它**仅支持最大 3 个字节的 UTF-8 字符**(BMP 平面的字符)。 * `utf8mb4`:这是标准的、**完整的 UTF-8 编码**,支持**1 到 4 个字节**的字符,包含了所有 Unicode 字符,如 Emoji 表情符号、许多较新的汉字、特殊符号(如 `𝄞` 乐谱符号)等。 2. **`utf8` 是 `utf8mb3` 的别名**:在 MySQL 内部和官方文档中,`utf8` **明确地被定义为 `utf8mb3` 的同义词**。当你指定 `CHARACTER SET utf8` 时,MySQL 实际使用的是 `utf8mb3` 编码[^1][^2][^3]。 3. **历史原因与限制**: * 早期出于对存储空间和性能的考虑(当时四字节字符极少使用),MySQL 选择了只支持三字节的实现,并命名为 `utf8`[^2]。 * 这导致 `utf8` (`utf8mb3`) **无法存储需要四字节编码的 Unicode 字符**(如 Emoji 表情 😊,许多生僻汉字 等)。如果你尝试存储这些字符,将会导致数据丢失(通常表现为问号 `?`)或插入错误。 4. **强烈建议使用 `utf8mb4`**: * 随着四字节字符(尤其是 Emoji)的普及,`utf8mb3` / `utf8` 的限制日益突出。 * **现代应用程序应始终使用 `utf8mb4` 字符集** 来确保完整的 Unicode 支持,避免字符丢失问题[^1][^2][^3]。 * 从 MySQL 8.0 开始,`utf8mb4` 已成为默认字符集。 5. **转换注意事项**: * 如果要将现有数据库或表从 `utf8` (`utf8mb3`) 转换为 `utf8mb4`,需要特别注意索引长度限制(因为单个字符可能更长)。例如,`VARCHAR(255)` 在 `utf8mb4` 下存储的最大字节数可能超过索引键长度限制(767 字节),可能需要调整列长度或使用前缀索引[^3]。 **总结**: > MySQL 中的 `utf8` 字符集确切地等同于 `utf8mb3`。它是一个最多只使用 3 字节表示字符的 UTF-8 子集,不支持完整的 Unicode(特别是四字节字符)。为了获得最佳的兼容性和支持现代字符(如 Emoji),应优先使用 `utf8mb4` 字符集[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值