You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:00:59