Nodejs 在 ubuntu 下连接 sqlserver 遇到编码问题,中文显示乱码

Nodejs 在 ubuntu 下连接 sqlserver 遇到编码问题,中文显示乱码

node.js里用到是node-odbc,通过freetds+unixodbc连接sqlserver

Database=require('odbc').Database,
db=new Database(),
cn="DSN=SERVER;UID=sa;PWD=pwd;DATABASE=db",
iconv=require('iconv-lite');
    http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
    db.open(cn,function(err){
    	if(err) return console.log(err);
    
    	db.query("select top 20 usernc from theuser order by userid desc",function(err,rows,moreResultSets){
    		if(err) return console.log(err);
    var a="";
     for (var i in rows) {  
             a+=rows[i].usernc+',';
            console.log(rows[i].usernc);      
        }      
    response.write(a);		    		
    	});   
    
     db.close(function (err) {
            console.log("the database connection is now closed");
        });
    });

输出到中文都是???????问号,

而直接用isql -v server sa pwd 查出来到中文能正常显示 用tsql -S server -p 1433 -U sa -P pwd 查出来到也没事,

就用node-odbc 出来的是??????


2 回复

Nodejs 在 Ubuntu 下连接 SQLServer 遇到编码问题,中文显示乱码

背景信息

在使用 Node.js 连接 SQL Server 时,可能会遇到编码问题导致中文显示为乱码。本文将讨论如何解决这个问题。

问题描述

使用 node-odbc 库通过 freetds + unixodbc 连接到 SQL Server 后,查询结果中的中文字符显示为问号(??????)。然而,使用 isqltsql 工具查询时,中文字符能够正确显示。

解决方案

  1. 检查数据库和表的编码 确保 SQL Server 数据库和表的字符集设置为支持中文的编码,例如 Chinese_PRC_CI_AS

  2. 配置 freetds.conf 确保 freetds.conf 文件中正确的字符集配置:

    [global]
        tds version = 8.0
        client charset = UTF-8
    
    [SERVER]
        host = <your_server_ip>
        port = 1433
        tds version = 8.0
        client charset = UTF-8
    
  3. 使用 iconv-lite 处理字符编码 使用 iconv-lite 库将数据从数据库的编码转换为 UTF-8 编码。

    示例代码如下:

    const odbc = require('odbc');
    const iconv = require('iconv-lite');
    
    const cn = "DSN=SERVER;UID=sa;PWD=pwd;DATABASE=db";
    
    async function fetchData() {
        try {
            const db = await odbc.connect(cn);
            const result = await db.query("SELECT TOP 20 usernc FROM theuser ORDER BY userid DESC");
    
            let a = "";
            for (const row of result) {
                // Convert the character encoding to UTF-8
                const usernc = iconv.decode(new Buffer.from(row.usernc), 'GBK'); // 假设数据库使用 GBK 编码
                a += usernc + ',';
                console.log(usernc);
            }
    
            console.log(a);
            db.close();
        } catch (err) {
            console.error("Error:", err);
        }
    }
    
    fetchData();
    

解释

  • 数据库和表的编码:确保数据库和表使用支持中文的编码格式,如 GBKUTF-8
  • 配置 freetds.conf:确保 freetds.conf 文件中的 client charset 设置为 UTF-8
  • 使用 iconv-lite:在 Node.js 中使用 iconv-lite 库将从数据库获取的数据从指定编码(如 GBK)转换为 UTF-8

通过上述步骤,可以有效解决 Node.js 在 Ubuntu 下连接 SQL Server 时遇到的中文乱码问题。


在使用 Node.js 和 node-odbc 连接 SQL Server 时遇到中文乱码问题,通常是因为字符编码不匹配导致的。可以通过以下步骤解决:

  1. 确保数据库和表的字符集设置正确:确保 SQL Server 数据库和表的字符集支持中文,并且表中的数据以正确的编码存储。

  2. 在读取数据时转换编码:可以使用 iconv-lite 库将读取的数据从服务器的字符集转换为 UTF-8。

以下是修改后的示例代码:

const odbc = require('odbc');
const iconv = require('iconv-lite');

const cn = "DSN=SERVER;UID=sa;PWD=pwd;DATABASE=db";

async function run() {
    const db = new odbc.Database();
    await db.open(cn);

    // 设置查询时的字符编码
    db.exec("SET NAMES 'utf8'", [], (err) => {
        if (err) throw err;
        
        db.query("SELECT TOP 20 usernc FROM theuser ORDER BY userid DESC", (err, rows) => {
            if (err) throw err;

            let result = "";
            for (let row of rows) {
                // 将结果转换为 UTF-8 编码
                const convertedValue = iconv.decode(new Buffer(row.usernc, 'binary'), 'gbk'); // 假设服务器端字符集是 GBK
                result += convertedValue + ', ';
                console.log(convertedValue);
            }

            // 返回 HTTP 响应
            response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
            response.write(result);
            response.end();

            // 关闭数据库连接
            db.close((err) => {
                if (err) throw err;
                console.log("The database connection is now closed");
            });
        });
    });
}

run().catch(console.error);

解释

  1. 数据库连接:使用 odbc.Database() 创建一个新的数据库对象,并使用 .open(cn) 方法打开连接。
  2. 查询设置:通过 db.exec("SET NAMES 'utf8'") 确保查询时使用 UTF-8 编码。
  3. 读取数据:在遍历查询结果时,使用 iconv.decode 将从数据库读取的数据从服务器的字符集(例如 GBK)转换为 UTF-8。
  4. 返回响应:将转换后的数据写入 HTTP 响应中。

通过上述方法,可以确保从 SQL Server 读取的中文数据能够正确显示。

回到顶部