文章目录
- 概念
- 1、字符集
- 1.1、举例
- 1.2、常见字符集 utf8 和 utf8mb4 区别
- 1.3、字符集 使用
- 2、排序规则
- 2.1、举例
- 2.2、常见的排序规则 utf8mb4_bin 、utf8mb4_general_ci、utf8mb4_unicode_ci
- 2.3、使用
概念
在 MySQL 中,字符集(character set)和排序规则(collation)是两个相关但不同的概念:
字符集(character set)定义了如何将字符存储到字节中。
排序规则(collation)定义了如何比较字符,以及在排序和搜索时如何处理字符。
1、字符集
1.1、举例
1.2、常见字符集 utf8 和 utf8mb4 区别
- 字符支持范围:
utf8:仅支持最多3字节的UTF-8字符。这意味着它只能表示基本多语言平面(BMP)的字符,即 Unicode 范围内的 U+0000 至 U+FFFF 的字符。这种字符集无法表示一些扩展的 Unicode 字符(例如表情符号和某些东亚文字)。
utf8mb4:支持最多4字节的UTF-8字符。这意味着它可以表示所有的 Unicode 字符,包括基本多语言平面的字符以及补充平面字符(例如表情符号和历史文字)。
- 存储需求:
utf8:每个字符最多需要3个字节。
utf8mb4:每个字符最多需要4个字节。因此,在存储相同数量的字符时,utf8mb4 可能比 utf8 占用更多的存储空间。
- 兼容性:
utf8 和 utf8mb4 在表示基本多语言平面(BMP)字符时是兼容的,但在表示补充平面字符时,只有 utf8mb4 能正确处理这些字符。
- 选择建议
如果你的应用程序需要处理表情符号或者某些特定的Unicode字符(如东亚的历史文字),建议使用 utf8mb4。
如果你只需要处理基本多语言平面的字符,utf8 也可以满足需求,但一般建议使用 utf8mb4 以确保更广泛的字符集支持和未来的兼容性。
1.3、字符集 使用
- 定义表结构
DEFAULT CHARSET=utf8mb4
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
- 在配置文件中定义
可以确保在新建数据库、表和列时默认使用 utf8mb4 字符集。
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2、排序规则
2.1、举例
2.2、常见的排序规则 utf8mb4_bin 、utf8mb4_general_ci、utf8mb4_unicode_ci
简单说,需要支持大小写的就用 utf8mb4_bin
-
utf8mb4_general_ci:不区分大小写,比较速度较快,但支持的Unicode特性不如utf8mb4_unicode_ci。
-
utf8mb4_unicode_ci:不区分大小写,支持完整的Unicode排序规则,处理更为精确和全面。
-
utf8mb4_bin 的特点
区分大小写:utf8mb4_bin 是区分大小写的,因为它是基于字符的二进制值进行比较。例如,‘a’ 和 ‘A’ 被认为是不同的字符。
区分字符顺序:比较时严格按照每个字符的二进制编码值进行,utf8mb4_bin 会区分所有字符的顺序,包括大小写字母和其他符号。 -
使用场景
精确比较:当需要对字符串进行精确的、区分大小写的比较时,utf8mb4_bin 是理想的选择。例如,密码比较和需要区分大小写的标识符。
存储敏感数据:存储对大小写敏感的数据时,比如用户名、产品代码等,可以使用 utf8mb4_bin 以确保数据的准确性。
2.3、使用
- 在表结构定义时使用
COLLATE=utf8mb4_bin
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
- 在进行查询时使用
SELECT * FROM example WHERE name = 'ExampleName' COLLATE utf8mb4_bin;