字符集与校对规则
引言 提出问题 使用MySQL时,经常遇到字符编码问题: 中文乱码:插入"你好"变成"???" emoji存储失败:插入😀报错 utf8和utf8mb4有什么区别? 为什么查询"a"和"A"结果一样? 这就是字符集(Character Set)和校对规则(Collation)的问题! 字符集基础 什么是字符集? 字符集:定义了字符与二进制编码的映射关系。 示例: ASCII:A → 0x41(65) UTF-8:你 → 0xE4BDA0 UTF-8:😀 → 0xF09F9880 MySQL常用字符集 字符集 字节数 支持字符 推荐使用 latin1 1字节 西欧字符 ❌ 不支持中文 gbk 1-2字节 简体中文 ⚠️ 老项目 utf8 1-3字节 多语言 ❌ 不支持emoji utf8mb4 1-4字节 多语言+emoji ✅ 推荐 utf8 vs utf8mb4 ⚠️ 重要:MySQL的utf8不是真正的UTF-8! utf8:最多3字节,不支持emoji(😀需要4字节) utf8mb4:最多4字节,支持emoji和生僻字 -- ❌ 错误:utf8存储emoji CREATE TABLE test (name VARCHAR(50)) CHARACTER SET utf8; INSERT INTO test VALUES ('你好😀'); -- ERROR 1366: Incorrect string value -- ✅ 正确:utf8mb4存储emoji CREATE TABLE test (name VARCHAR(50)) CHARACTER SET utf8mb4; INSERT INTO test VALUES ('你好😀'); -- 成功 查看字符集 -- 查看数据库字符集 SHOW VARIABLES LIKE 'character_set%'; -- 输出示例: +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | +--------------------------+----------------------------+ -- 查看表的字符集 SHOW CREATE TABLE users; 校对规则(Collation) 什么是校对规则? 校对规则:定义字符的比较和排序规则。 ...