使用nodejs将mysql查询从latin1转换为utf8

时间:2014-01-02 14:04:47

标签: mysql node.js encoding latin1 node-mysql

我在 latin1 中有一个数据库,我想将其查询转换为  的 UTF-8

示例:

response.write 返回此JSON:

{"questions":[{"question":"Nação","answer":"País"}]}

但我需要将它转换为utf8:

{"questions":[{"question":"Nação","answer":"País"}]}




conexao_bd.getConnection(function(err,con){
            if(err) return console.log("Erro na conexao. "+err);
            con.query("SELECT question, answer FROM "+tipo+" WHERE id IN "+c,function(err, rows){
                if(err) console.log("Erro na query questions: "+err);
                else{
                    for(var k =0;k<rows.length;k++)
                        perguntas.questions[k]={'question': rows[k].question,'answer':rows[k].answer};
                    console.log(JSON.stringify(perguntas));
                    con.release();
                    response.writeHeader(200, {"Content-Type": "text/plain"});
                    response.write(JSON.stringify(perguntas));
                    response.end();
                }
            });

        });

2 个答案:

答案 0 :(得分:3)

您需要一个额外的模块来转换不同的字符串编码。 node-iconv似乎是你正在寻找的!它也是由libuv / node的核心开发人员创建的,所以它应该是可持续的。但是,如果可能的话,请考虑更新数据库上的编码,因为这可能是最持久的解决方案。

PS:对于node-mysql,也应该可以直接将传入的数据传输到编码流(可能无法工作,但你明白了):

var mysql = require('mysql');
var iconv = require('iconv');

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret'
});

connection.connect();
var query = connection.query('SELECT 1 + 1 AS solution')
var encoder = new iconv.Iconv('latin1', 'utf-8');

// will encode result and pipe it to your terminal
query.pipe(encoder.pipe(process.stdout));

修改: 如果更新数据库不是一个选项,Thomas提出了在node-mysql中设置charset的好建议。这也似乎有可能见here,并且应该比我的黑客更好。但是,如果您不使用node-mysql,这可能是一种解决方法。

答案 1 :(得分:3)

重新编码@bodokaiser发布的字符串也是一种可能,但它不是一个干净的系统解决方案。干净的解决方案是告诉数据库给你utf-8 。这可以通过两种方式完成:

  1. 使用查询set names utf8设置连接字符集。
  2. 创建连接时设置连接字符集。不知道node.js中是否可以这样做。如果不使用上述选项。