Node.js读取SQL Server生僻中文乱码问题求助(不改数据库)
解决SQL Server varchar字段Node.js读取乱码问题
问题根源
核心是编码不匹配:SQL Server的varchar字段使用数据库默认的中文编码(大概率是GBK/CP936)存储,而Node.js数据库驱动默认以UTF-8解码这些字节,导致原本双字节的“鉫”被错误解析为乱码+“r”。ERP系统因和数据库编码规则一致,所以能正常显示。
不修改数据库的解决方案
1. 调整数据库连接的编码配置
如果使用mssql驱动,直接在连接配置中指定与数据库匹配的编码(比如CP936,对应GBK):
const sql = require('mssql'); const config = { user: '你的用户名', password: '你的密码', server: '数据库地址', database: '目标数据库', options: { charset: 'CP936' // 与数据库排序规则对应的编码,比如Chinese_PRC_CI_AS对应CP936 } }; async function fetchData() { await sql.connect(config); const result = await sql.query`SELECT your_target_column FROM your_table`; console.log(result.recordset[0].your_target_column); // 输出正确的“鉫承工程” } fetchData().catch(err => console.error(err));
- 先确认数据库排序规则:执行
SELECT SERVERPROPERTY('Collation'),若返回Chinese_PRC_CI_AS,则对应编码为CP936。
2. 手动转码(连接配置无法修改时)
若无法调整连接编码,可先读取字段的原始二进制数据,再用对应编码解码:
async function fetchRawData() { await sql.connect(config); // 将varchar字段转为varbinary获取原始字节 const result = await sql.query`SELECT CAST(your_target_column AS VARBINARY(MAX)) AS raw_bytes FROM your_table`; const rawBuffer = Buffer.from(result.recordset[0].raw_bytes); // 用GBK编码解码缓冲区 const correctText = rawBuffer.toString('gbk'); console.log(correctText); // 输出正确内容 } fetchRawData().catch(err => console.error(err));
3. 验证编码匹配性
执行以下SQL确认数据库的代码页:
SELECT COLLATIONPROPERTY('Chinese_PRC_CI_AS', 'CodePage')
- 返回
936→ 对应GBK/CP936 - 返回其他值则根据代码页选择对应的编码名称(比如
1252对应latin1)
内容的提问来源于stack exchange,提问作者Xyanophat
相关产品推荐
相关产品推荐

