nodeJs mysql GBK编码转换
发布于 9小时前 作者 backsapce 53 次浏览 来自 分享

node.js不支持GBK,至少目前是不支持。 但在项目中,有时候也需要用到以前的老项目的数据库。而以前很多数据库是GBK编码…

这个时候,编码转换就是必须要完成的工作了。 我们需要用到的包

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

关于这两个包,第一个算是链接mysql的驱动包(pure js),第二个是编码转换库(pure js),具体的用法可以去npm查。

进入主题。

我们看看第一个版本

//创建一个mysql连接池,默认的链接十个
var pool = mysql.createPool({
  host : '127.0.0.1',
  user : 'root',
  password : '****',
  database:'my_db',
  charset: 'GBK',
});
//获取一个连接
pool.getConnection(function (err,connection) {
  connection.query('select * from education limit 1',function (err,rows,fields) {
    if(err) throw err;
    console.log('rows ' + 0 + ' : ' + iconv.decode(new Buffer(rows[0].school),'GBK') /*把buffer按GBK解码*/);
    connection.release(); //释放连接
    pool.end(); //程序结束时关闭连接池
  });
});

此版本无情的乱码。

仔细查阅mysql API,这个包会自动做类型转换,自动把mysql类型转换成js里面的数据类型,但是有参数 typeCast 可以控制,默认是true,把他设置为false试试。 那就试试吧

var pool = mysql.createPool({
  host : '127.0.0.1',
  user : 'root',
  password : '****',
  database:'my_db',
  charset: 'GBK',
  typeCast: false,
});

这个版本还是乱码了。很有意思的是除了VAR_STRING其他的类型都返回的是buffer,也就是说自动转码在其他类型上有效,但是在VAR_STRING上无效了。

最后的解决办法,把自动转换关闭,并且自定义转换函数

pool.getConnection(function (err,connection) {
  connection.query({sql:'select * from education limit 1',typeCast: function (field, next) {
    if(field.type =='VAR_STRING' && field.name=='school'  /*判断条件自定义*/){
      // console.log(field);
      //field除了有buffer()方法,还有geometry()和string() ,具体请查阅api
      //console.log(iconv.decode(field.buffer(),'gbk'));
      return iconv.decode(field.buffer(),'gbk');
    }
    return next();
  }},function (err,rows,fields) {
  //your code
  });
});

得到正确结果,搞定。

回到顶部