一、核心概念
1. 字符 (Character):文字和符号的统称,如 'A', '1', '中', '$'。
2. 字符集 (Character Set):一个系统支持的所有抽象字符的集合。它定义了每个字符对应的编号(即码位)。
常见字符集:
`ASCII`:基础,包含英文字母、数字、控制字符。
`latin1`:西欧字符集,MySQL 早期默认字符集。
`gbk`:支持简体中文的国标扩展字符集。
`utf8`/`utf8mb4`:Unicode 字符集在 MySQL 中的实现,支持全球几乎所有文字。`utf8mb4` 是真正的 UTF-8,支持包括表情符号(emoji)在内的所有字符,强烈推荐使用。
3. 字符编码 (Character Encoding):将字符的码位转换为计算机中存储的二进制数据的规则。
通常与字符集一对一对应(如 `GBK` 字符集对应 `GBK` 编码)。特例是 Unicode,它有多种编码方案(UTF-8, UTF-16, UTF-32)。
4. 校对规则 (Collation):同一个字符集内,字符的比较和排序规则。
命名规则:`<字符集名>_<语言名>_<比较规则>`
比较规则后缀**:
`_ci` (Case Insensitive):大小写不敏感。`'A' = 'a'`
`_cs` (Case Sensitive):大小写敏感。`'A' != 'a'`
`_bin` (Binary):基于字符的二进制编码值进行比较,区分大小写,且可用于任何字符集。
二、查看与设置
1. 查看字符集设置:
SHOW VARIABLES LIKE 'character\_set\_%';
关键变量:
`character_set_client`:客户端发送语句时使用的编码。
`character_set_connection`:服务器接收语句后转换成的编码。
`character_set_results`:服务器返回结果时使用的编码。
`character_set_database`:当前默认数据库的编码。
`character_set_server`:服务器的默认编码。
2. 查看校对规则设置:
SHOW VARIABLES LIKE 'collation\_%';
通常 `collation_connection`, `collation_database`, `collation_server` 会与对应的字符集设置相匹配。
三、MySQL 字符集转换流程(解决乱码的关键)
四、最佳实践与总结
1. 统一编码原则:杜绝乱码最根本的方法是保持“三端统一”。
客户端环境:确保你的应用程序、命令行终端使用同一种编码(强烈推荐 `UTF-8`)。
MySQL连接配置:在建立连接后,立即执行 `SET NAMES 'utf8mb4';`。这条命令一次性设置 `character_set_client`, `character_set_connection`, `character_set_results` 为 `utf8mb4`,确保了连接层面的编码统一。
数据库设计:将 `character_set_server`、数据库、表、列的字符集都设置为 `utf8mb4`。
2. 如何修复乱码:
首先通过 `SHOW VARIABLES LIKE 'character\_set\_%';` 诊断各个环节的编码设置。
确保 `character_set_client` 和 `character_set_results` 与你的客户端实际使用的编码一致。使用 `SET NAMES` 命令可以快速统一它们。
确保存储层(数据库、表)的字符集设置正确。
3. 校对规则选择:
通常使用 `utf8mb4_general_ci` 即可,因为大小写不敏感的排序更符合大多数业务逻辑(如用户名搜索)。
如果需要精确的、区分大小写的比较(如密码验证、大小写敏感的唯一键约束),则使用 `utf8mb4_bin` 或 `utf8mb4_0900_as_cs`(MySQL 8.0+)。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程