SQL Server存储过程中文乱码主因是排序规则不匹配而非字符集问题需逐层检查数据库、表列、字符串字面量须加N前缀、动态SQL及客户端驱动是否统一支持Unicode或UTF-8排序规则。SQL Server 存储过程中中文乱码大概率是排序规则不匹配不是字符集问题而是排序规则Collation在字符串比较、排序和隐式转换时偷偷改了编码行为。尤其当存储过程里用 NVARCHAR 接收参数但数据库或列用的是 SQL_Latin1_General_CP1_CI_AS 这类非 Unicode 意识强的排序规则时CONVERT 或拼接操作可能丢字节。检查当前数据库默认排序规则SELECT DATABASEPROPERTYEX(your_db_name, Collation)检查关键表字段的排序规则SELECT name, collation_name FROM sys.columns WHERE object_id OBJECT_ID(your_table) AND system_type_id IN (167, 175, 231, 239)如果返回结果含 _CP1_如 SQL_Latin1_General_CP1_CI_AS说明它默认按 Code Page 1252 处理对中文不友好优先比对是否为 Latin1_General_100_CI_AS_SC_UTF8SQL Server 2019或带 _SCSupplementary Characters标识的规则ALTER DATABASE … COLLATE 不会自动更新已有列的排序规则执行 ALTER DATABASE your_db COLLATE Latin1_General_100_CI_AS_SC_UTF8 只改数据库默认值不影响已存在表字段的 collation_name。这些字段仍按旧规则解析字符串导致存储过程里 WHERE name input 匹配失败或返回空——你以为是参数没传进来其实是排序规则不一致导致比较被静默转义。必须逐列修正用 ALTER TABLE your_table ALTER COLUMN your_col NVARCHAR(100) COLLATE Latin1_General_100_CI_AS_SC_UTF8注意该操作会重建列锁表时间取决于数据量生产环境务必避开高峰若列上有索引、约束或计算列需先删后建否则报错 Cannot alter column because it is used in a constraint存储过程内字符串字面量要加 N 前缀否则触发隐式转换写 SET sql SELECT * FROM t WHERE name 张三SQL Server 默认按数据库排序规则解释这个字符串字面量。即使列是 NVARCHAR只要字面量没加 N就会先转成非 Unicode 编码再比较中间一步就可能把「张」变成问号或乱码。 VWO 一个A/B测试工具