中文数据出现乱码怎么处理
中文入库/查询出乱码的原因:数据类型 varchar 与 nvarchar 混用、排序规则与客户端编码不匹配,以及定位与修复路径。
简短答案
中文乱码多是数据类型层问题:varchar(非 Unicode)存中文受排序规则与代码页限制,跨类型转换(varchar ↔ nvarchar)时编码对不上就乱。查清「存的时候还是取的时候」乱的,再定位类型链路。
排查步骤
- 查列的数据类型:
SELECT name, type, collation_name
FROM sys.columns WHERE object_id = OBJECT_ID(N'表名');
- 判断乱码发生阶段:
- 入库就乱:应用端编码问题或目标列是
varchar,建议改nvarchar; - 入库正常、取出乱:排序规则/客户端显示层问题。
- 入库就乱:应用端编码问题或目标列是
- 混用类型时显式转换,避免隐式转换吃掉信息:
CAST(列 AS NVARCHAR(100))。 - 列改
nvarchar:
ALTER TABLE 表名 ALTER COLUMN 列名 NVARCHAR(100) NULL;
- 在 SSMS 结果里仍显示乱码时,核对 SQL Server 2022 Developer 条目页说明的排序规则支持,跨实例取数时两侧排序规则要一致。
- 老库兼容行为以 SQL Server 2019 Developer 条目页核对。
现象对照表
| 现象 | 指向 |
|---|---|
| 存进去就乱 | 应用编码或列类型 |
| 取出才乱 | 排序规则/显示层 |
| 个别字乱、多数正常 | varchar 截断或非 BMP 字符 |
操作小结
- 统一用 nvarchar 存中文,是绝大多数场景的正确选择。
- 改列前备份,ALTER COLUMN 不可回退。
- 跨实例交换数据时对齐排序规则。