一、核心概念

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+)。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)