
文章目录 核心概念字符集与编码 常见编码类型详解ASCIILatin1ISO-8859-1GBKUTF-8UTF-8mb4编码类型对比速查 SQL 中的编码实践创建数据库时指定编码创建表时指定编码为特定列指定编码查看编码信息服务器端配置文件设置my.cnf / my.ini 校对规则Collation 常见编码问题与排查中文乱码的根本原因排查思路字符集转换注意事项 最佳实践总结 核心概念字符集与编码在深入 SQL 编码之前需要先理解几个基础概念字符Character人类语言中最小的书写单位如英文字母、汉字、数字、标点符号等。字符集Character Set一组字符的集合定义了可以存储和处理的字符范围。例如 ASCII 包含 128 个字符Unicode 则几乎涵盖世界上所有语言的字符。编码Encoding将字符转换为二进制数据的过程。计算机无法直接存储文字编码就是字符与二进制的映射规则。校对规则Collation决定字符集中字符如何比较和排序的规则如大小写是否敏感、排序顺序等。 简单理解字符集是有哪些字编码是怎么存成二进制校对规则是怎么比较和排序。 常见编码类型详解ASCII使用 7 位二进制数表示128 个字符包括英文字母、数字、标点符号和控制字符仅能覆盖英文环境不支持中文适用场景纯英文文本存储Latin1ISO-8859-18 位字符编码可表示西欧语言中的大部分字符英语、法语、德语、西班牙语等不支持中文、日文等东亚语言适用场景面向欧洲市场的单语言应用GBK中国的国家标准字符集主要用于简体中文环境固定用2 个字节表示一个汉字收录约 2.1 万个汉字适用场景仅需支持中文的国内项目UTF-8基于 Unicode 的变长编码方案是目前开发中的首选编码英文字符用1 个字节兼容 ASCII中文通常用3 个字节特殊符号用4 个字节既解决了 Unicode 的空间浪费问题又实现了全球语言兼容UTF-8mb4UTF-8 的超集额外支持4 字节字符如 Emoji 表情MySQL 中的utf8实际只支持最多 3 字节无法存储 Emoji适用场景需要存储表情符号、生僻字的应用如社交、即时通讯编码类型对比速查编码类型字节数支持中文支持Emoji典型场景ASCII1❌❌纯英文Latin11❌❌西欧语言GBK2汉字✅❌国内单语言项目UTF-81~4变长✅❌MySQL中多语言通用UTF-8mb41~4变长✅✅多语言Emoji SQL 中的编码实践创建数据库时指定编码-- 推荐使用 utf8mb4 支持所有字符CREATEDATABASEmydatabaseCHARACTERSETutf8mb4COLLATEutf8mb4_general_ci;创建表时指定编码CREATETABLEusers(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(255),bioTEXT)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ci;为特定列指定编码CREATETABLEarticles(idINTPRIMARYKEY,titleVARCHAR(200)CHARACTERSETutf8mb4,contentLONGTEXTCHARACTERSETutf8mb4);查看编码信息-- 查看服务器全局字符集配置SHOWVARIABLESLIKE%char_set%;-- 查看指定数据库的字符集SHOWCREATEDATABASE库名;-- 查看指定表的字符集SHOWCREATETABLE表名;-- 查看数据库支持的所有字符集SHOWCHARSET;服务器端配置文件设置my.cnf / my.ini[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_general_ci 校对规则Collation校对规则决定了字符的比较和排序方式常见的有utf8mb4_general_ci校对速度快准确性相对较低适合对性能要求高的场景utf8mb4_unicode_ci遵循 Unicode 标准更准确适合需要精确排序的场景utf8mb4_bin二进制比较区分大小写⚠️ci表示 case insensitive不区分大小写cs表示 case sensitive区分大小写bin表示二进制比较。 常见编码问题与排查中文乱码的根本原因乱码的本质是编码与解码规则不匹配常见原因包括数据库默认编码为 ASCII、Latin1 等不支持中文的编码客户端与数据库服务端编码不一致如客户端用 UTF-8服务端用 GBK数据在传输过程中经历了错误的编码转换排查思路统一编码确保客户端、连接层、数据库服务端、数据表使用相同的字符集推荐utf8mb4检查连接编码连接数据库时指定编码如SET NAMES utf8mb4;检查客户端工具确保 Navicat、MySQL Workbench 等工具的编码设置为 UTF-8检查应用层确保程序代码中字符串编码与数据库一致字符集转换注意事项当数据在不同字符集环境之间传递时数据库会进行自动转换。需要注意转换过程消耗系统资源频繁转换可能影响性能不兼容的字符可能导致数据丢失或乱码如 UTF-8 中的某些字符无法用 GBK 表示建议从设计阶段就统一编码避免后期转换 最佳实践总结新建项目一律使用utf8mb4而非utf8避免 Emoji 存储失败校对规则根据需求选择一般场景用utf8mb4_general_ci精确排序用utf8mb4_unicode_ci全链路统一编码客户端 → 连接层 → 数据库 → 表 → 列保持一致CHAR vs VARCHARCHAR(n)是定长存储VARCHAR(n)是变长存储n 代表字符个数而非字节数实际占用字节取决于编码方式迁移旧项目时使用ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4;进行编码迁移并验证数据完整性