思考
就中文而言,MySQL 中可以选择 gb2312 、utf8 及 utf8mb4 。这三种字符集有什么差异 ?应该如何选择?
比较项 | gb2312 | utf8 | utf8mb4 |
---|---|---|---|
字符集范围 | 简体中文字符集 | 大部分 Unicode 字符 | 更广泛的 Unicode 字符,包括罕见字符和 Emoji 表情符号 |
编码方式 | 使用 1-2 个字节表示字符 | 使用 1-4 个字节表示字符 | 使用 1-4 个字节表示字符 |
兼容性 | 主要用于简体中文环境 | 良好的兼容性,支持多种语言 | 更好的兼容性,支持更多的字符 |
存储空间 | 相对较小,适用于处理简体中文数据 | 根据字符的 Unicode 码点进行编码,可能需要更多的存储空间 | 相对于 utf8,可能需要更多的存储空间,但能够处理更广泛的字符 |
如上表,如果只需要处理简体中文数据,可以选择 gb2312
;如果需要处理多种语言的文本,建议使用 utf8
或 utf8mb4
以确保更好的兼容性和支持。
综合来看,utf8mb4
无疑是不错的选择(字符集范围大、兼容性高,现在硬件成本相对不是很高)。
utf 系
utf 相关的字符集
mysql> show charset like 'utf%' ;
+---------+------------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+------------------+--------------------+--------+
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8mb3 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+---------+------------------+--------------------+--------+
5 rows in set (0.00 sec)
utf 相关字符集比较
MySQL 支持多种字符集,包括 utf8、utf16、utf16le、utf32、utfmb3 和 utfmb4。这些字符集之间的主要差异在于它们存储字符的方式和所支持的字符范围。
- utf8:utf8 是一种变长编码,使用 1 到 4 个字节来表示一个字符。它是最常用的 Unicode 字符集之一,向后兼容 ASCII 编码。
- utf16:utf16 是一种固定长度的编码,使用 2 或 4 个字节来表示一个字符。它可以是 UTF-16LE(Little Endian)或 UTF-16BE(Big Endian)。
- utf16le:utf16le 是 UTF-16 的一种实现方式,它是 Little Endian 字节序,低字节在内存的低地址,高字节在高地址。
- utf32:utf32 是一种固定长度的编码,使用 4 个字节来表示一个字符。
- utfmb3:utfmb3 是 MySQL 特定的字符集,它是 UTF-8 的扩展,支持存储一些罕见的字符。
- utfmb4:utfmb4 是 MySQL 5.7 及以上版本中引入的字符集,它是 UTF-8 的超集,支持存储更广泛的 Unicode 字符,包括 Emoji 表情符号等。
总体来说,如果只需要处理基本的 Unicode 字符,utf8 通常是足够的。如果需要处理更多的字符,特别是包含 Emoji 等特殊字符,或者在特定的数据库环境中,可以考虑使用 utf16、utf32、utfmb3 或 utfmb4。选择合适的字符集应根据具体的需求和应用场景来决定。
utf8mb4
就 utf8系而言,使用utf8mb4字符集,可以确保数据库能够正确地存储和检索来自各种语言和地区的文本数据。它非常适用于需要支持多语言和多字符集的应用程序,特别是涉及到用户输入、存储或显示表情符号的情况。
支持的排序规则
与其他字符集一样,utf8mb4也支持很多排序规则(字符集校验规则),可以使用 SQL 查看。
-- 内置命令查询
show collation where Charset='utf8mb4';
-- SQL 查询
select * from information_schema.collations where character_set_name = "utf8mb4" order by COLLATION_NAME;
结果
# 使用内置命令
mysql> show collation where Charset='utf8mb4';
+----------------------------+---------+-----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | Yes | Yes | 0 | NO PAD |
| utf8mb4_0900_as_ci | utf8mb4 | 305 | | Yes | 0 | NO PAD |
| utf8mb4_0900_as_cs | utf8mb4 | 278 | | Yes | 0 | NO PAD |
| utf8mb4_0900_bin | utf8mb4 | 309 | | Yes | 1 | NO PAD |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | PAD SPACE |
| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 | PAD SPACE |
| utf8mb4_cs_0900_ai_ci | utf8mb4 | 266 | | Yes | 0 | NO PAD |
| utf8mb4_cs_0900_as_cs | utf8mb4 | 289 | | Yes | 0 | NO PAD |
| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 | PAD SPACE |
| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 | PAD SPACE |
| utf8mb4_da_0900_ai_ci | utf8mb4 | 267 | | Yes | 0 | NO PAD |
| utf8mb4_da_0900_as_cs | utf8mb4 | 290 | | Yes | 0 | NO PAD |
| utf8mb4_de_pb_0900_ai_ci | utf8mb4 | 256 | | Yes | 0 | NO PAD |
| utf8mb4_de_pb_0900_as_cs | utf8mb4 | 279 | | Yes | 0 | NO PAD |
| utf8mb4_eo_0900_ai_ci | utf8mb4 | 273 | | Yes | 0 | NO PAD |
| utf8mb4_eo_0900_as_cs | utf8mb4 | 296 | | Yes | 0 | NO PAD |
| utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 | PAD SPACE |
| utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 | PAD SPACE |
| utf8mb4_es_0900_ai_ci | utf8mb4 | 263 | | Yes | 0 | NO PAD |
| utf8mb4_es_0900_as_cs | utf8mb4 | 286 | | Yes | 0 | NO PAD |
| utf8mb4_es_trad_0900_ai_ci | utf8mb4 | 270 | | Yes | 0 | NO PAD |
| utf8mb4_es_trad_0900_as_cs | utf8mb4 | 293 | | Yes | 0 | NO PAD |
| utf8mb4_et_0900_ai_ci | utf8mb4 | 262 | | Yes | 0 | NO PAD |
| utf8mb4_et_0900_as_cs | utf8mb4 | 285 | | Yes | 0 | NO PAD |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE |
| utf8mb4_german2_ci