数据库字符集

📅 2026/8/20 17:21:00
数据库字符集
数据库字符集这是一个对数据存储、显示和多语言支持至关重要的概念。核心概念拆解要理解数据库字符集需要先理清三个层层递进的概念字符集是什么一套规则的集合定义了哪些字符可以被识别。例如ASCII字符集只包含英文字母、数字和控制符号GB2312字符集包含简体中文汉字Unicode字符集旨在包含全世界所有的字符。类比一本字典的目录告诉你这本字典里收录了哪些字。编码是什么将字符集中的字符转换为计算机可以存储和传输的二进制数字的具体规则。一个字符集可以有多种编码方式。关键点字符集是“字符的集合”编码是“如何在计算机中表示这些字符”。类比给目录里的每个字分配一个唯一的编号。排序规则是什么定义了字符如何被比较、排序和搜索的规则。例如字母大小写是否敏感‘A’ 是否等于 ‘a’重音符号如何对待以及按照哪种语言的顺序排序。类比字典的检字法比如是按拼音排序、按部首排序还是按笔画排序。简单总结字符集决定你能存什么字编码决定这些字在硬盘上变成什么样的0和1排序规则决定这些字如何被比较和排序。常见数据库字符集编码详解1. UTF-8最推荐现代标准所属字符集Unicode。特点变长编码英文字符占1个字节中文汉字通常占3个字节。兼容ASCII纯英文文本在UTF-8和ASCII下编码结果相同。国际通用支持地球上几乎所有语言的字符。数据库中的对应名称MySQL/MariaDButf8mb4注意MySQL的utf8是阉割版只支持最多3字节无法存储表情符号如必须用utf8mb4。PostgreSQLUTF8。SQL ServerUTF-8从SQL Server 2019开始支持。使用场景万金油选择。除非有明确的遗留系统兼容要求否则新项目一律应使用UTF-8MySQL中为utf8mb4。2. GBK / GB2312 / GB18030中文环境遗留所属字符集中国国标字符集。特点定长/变长混合GBK中英文占1字节中文占2字节。GB18030更全面是变长编码。地域性主要针对简体中文也包含一些英文、日文假名等。使用场景旧的国内系统或需要与仅支持GBK的第三方系统交互。新项目不推荐因为无法存储藏文、维吾尔文或特殊符号。3. Latin1ISO-8859-1特点单字节编码仅支持西欧语言英文、法文、德文等。问题如果尝试存储中文字符会导致乱码或数据丢失。使用场景非常古老的、确定只处理西欧语言的系统。4. UTF-16 / UTF-32特点Unicode的其他编码形式。UTF-16通常是定长2字节补充字符占4字节UTF-32是定长4字节。使用场景在数据库内部存储中不常见更多用于内存操作或特定操作系统API。不推荐作为数据库存储编码因为空间利用通常不如UTF-8高效。为什么字符集设置如此重要乱码的根源乱码通常是由编码转换不一致造成的。数据从应用到数据库的传递链中任何一环的字符集不匹配都可能导致问题。典型的数据流路径应用程序/代码有自身编码 - 客户端连接指定连接编码 - 数据库服务器server层编码 - 数据库库级编码 - 表表级编码 - 列列级编码常见乱码场景“问号??”或“乱码方块”通常是在Latin1或其它单字节编码的数据库中存储了中文字符。数据库无法识别用占位符?替代。“黑底菱形问号”通常出现在UTF-8解码失败时表示遇到了无效的字节序列。“锟斤拷”等乱码著名的“锟斤拷”乱码源于GBK和UTF-8之间反复错误转换产生的特定字节序列。最佳实践与建议统一使用 UTF-8对于任何新项目将数据库、表、连接、应用程序的字符集统一设置为UTF-8MySQL务必用utf8mb4。这是国际化的基石。“四层一致”原则确保以下四层字符集一致就能杜绝99%的乱码问题数据库/表/列字符集建库建表时明确指定。客户端连接字符集在连接数据库的字符串中设置如JDBC URL中的characterEncodingUTF-8。应用程序字符集代码文件编码、HTTP请求/响应编码。终端/显示环境命令行终端、IDE或浏览器的编码。排序规则选择utf8mb4_general_ci旧式的通用排序规则速度快但某些语言排序不太精确。utf8mb4_unicode_ci基于Unicode标准排序能更准确处理多语言是现在的推荐选择。utf8mb4_bin纯粹的二进制比较区分大小写和重音。适用于需要精确匹配的场景如验证码、大小写敏感的用户名。迁移与兼容如果要将旧系统如GBK迁移到新系统UTF-8必须在迁移过程中进行正确的转码而不是简单地复制字节。比喻总结想象一下数据库是一个巨大的图书馆字符集决定了这个图书馆收藏哪种语言的书籍中文馆、英文馆、世界语馆。编码决定了每本书内部是用拼音、五笔字型还是摩斯电码写成的。排序规则决定了书架上的书是按拼音顺序、出版日期还是作者国籍排列。如果你的“编码”规则比如用五笔字型写的书和读者的“解码”规则他只会看拼音不匹配那么读者看到的就全是“乱码”。因此明确、统一地设置数据库字符集为UTF-8是保证数据“书写正确”和“阅读顺畅”最关键的第一步。