服务公告
开服数据库的字符集与排序规则
发布时间:2026-08-21 11:45
开服之后玩家昵称五花八门:生僻汉字、表情符号、各国文字都会出现。如果建库时字符集没配对,轻则昵称显示成问号,重则注册直接报错,玩家流失在登录第一步。字符集与排序规则是开服前五分钟就能配好的事,也是事后修复最麻烦的事之一。 ## 为什么默认值会坑人 数据库的默认字符集如果是老的拉丁系或早期的三字节中文字符集,前者存不了中文,后者存不了表情符号与部分生僻字,玩家昵称里恰好这两类最常见。更隐蔽的是混用问题:库是一个字符集,表是另一个,连接层又是第三个,数据写入时被转来转去,某个环节丢字符,事后对账几乎对不回来。排序规则同样影响体验:不同排序规则对大小写与重音的处理不同,账号系统按昵称查询时大小写不敏感的需求如果没对齐,同一个名字可能注册出两个账号。 ## 开服前的统一配置 开服前把三层统一到现代字符集:库、表、连接层全部用四字节的中文字符集,昵称里的表情与生僻字都能存下。建库时显式指定,不要依赖默认值: ```sql CREATE DATABASE game DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` 连接层也要对齐,应用连接串里显式声明字符集,避免依赖服务端握手时的默认协商。排序规则的选择看业务:账号与昵称查询通常要大小写不敏感,通用排序规则即可满足;对排序结果有精确要求的排行类功能,再单独评估。建好库后用测试账号写入带表情与生僻字的昵称,走一遍注册查询流程验证。 ## 常见错误与修复代价 错误一:建库时不指定,吃默认值,开服人气一起来才发现存不了表情昵称。修复要停服导数据重建索引,代价随玩家量增长。错误二:只改了库默认,存量表没动,新表正常旧表继续丢字,问题断断续续更难定位。错误三:迁移服务器时目标库字符集与源库不一致,导入过程静默转码,部分数据损坏。迁移前核对两边的字符集与排序规则完全一致,再执行导入,是必须养成的习惯。顺云用户在云服务器上自建数据库开服时,重装系统与迁移操作前后都要把这项核对纳入清单,配置层面的几秒钟,省掉数据层的几小时。 ## 排查方法 怀疑字符集问题时按三层排查:先看库与表的字符集定义,再看当前连接的字符集状态,最后实际写入测试数据验证。查询连接状态的常用语句是 `SHOW VARIABLES LIKE 'character_set%'`,输出里连接层与结果集的字符集都要与库一致。确认一致后仍有乱码,再查应用框架自身的编码配置,很多时候问题出在应用层而不是数据库。下一篇: 游戏服的线程模型与 CPU 选择