mysql pool连接池 插入中文乱码问题
发布于 9 年前 作者 moxiaobei2 6452 次浏览 最后一次编辑是 8 年前 来自 问答

各位好,数据库中应用mysql的链接池,其中配置如下: var pool = mysql.createPool({ host: config.db.host, user: config.db.user, password: config.db.password, port: config.db.port, database: config.db.dbName, // debug:true, charset: ‘GBK_CHINESE_CI’,//BIG5_CHINESE_CI default: UTF8_GENERAL_CI //charset: ‘GBK’, // stringifyObjects:true, typeCast: false } );

/**

  • @des 查询

  • @param sql

  • @param callback */ query=function (sql,callback){ pool.getConnection(function(err, connection) {

     connection.query(
    {sql:sql,typeCast: function (field,next) {
         if(field.type =='VAR_STRING'||field.type=='BLOB'){
             return iconv.decode(field.buffer(),'gbk');
         }
         return next();
     }
    },function(err, rows,fields) {          
         if (err) {
             connection.rollback(function() {
                 callback(err,null);
             });
         }
         callback(null,rows);
         connection.release();
         return ;
     });
    

    });

}

coQuery=function(sql){

return function(callback) {
    query(sql,callback);
};

}

/** *@des 插入

  • @param sql ‘INSERT INTO posts SET ?’

  • @param param{ title: ‘test’} */ function insert(sql,param,callback){ pool.getConnection(function(err, connection) {

     // Use the connection
     //pool.escape防sql注入
    
 **  connection.query("set names utf8;");//重新设置一下编码类型   **这里是解决问题的地方。
   var query= connection.query(sql,param, function(err, rows) {
    //   console.log(err);
        // And done with the connection.
        if (err) {
            connection.rollback(function() {
                // throw err;
                callback(err,null);
            });
        }
        connection.commit(function(err) {
            if (err) {
                connection.rollback(function() {
                    callback(err,null);
                });
            }
            callback(null,rows);//res返回数据
            connection.release();
            return ;
        });

//console.log(query.sql) // Don’t use the connection here, it has been returned to the pool.//返回池当中 });

});

} coInsert=function(sql,param){ return function(callback){ insert(sql,param,callback); } } 其中数据库对应的编码是GBK的,coQuery中查询时用typeCast可以解决中文乱码问题,但是在coInsert插入数据库中的时候,数据如下: sql: var params={ voter: ‘ling11111’, cTime: ‘2015-06-10 17:56:25’, voteId: 18, serialId: 4313, name: ‘奥迪A6L’, reason: ‘reason2下下下’, picUrl: ‘看下~’, openId: ‘oE1nWt7R6Dxj206R4u6MLuzHwSz4dAFF’ } var sql = "INSERT INTO mrbt_vote_records SET ?" var x = DB.coInsert(sql, params);//得到结果集 var res=yield x; console.log(res); 其中有中文字段的都是gbk编码的,表结构也是 从打印connect.sql中完全正确,但是结果中却提示: _TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: ‘\x8B’ for column ‘reason’ at row 1 类似这样的中文编码的问题,看过api,有个配置项stringifyObjects:true设置这个值,它不系列化,即它不重新给buffer了,我在想是不是这一步出了问题。有遇到的大神给个答复。小女子谢过。

2 回复

好吧,我自己回答。原来nodejs mysql目前不支持gbk,纠结了那么久,结果把所有的改成一致的utf8所有的问题就解决了,太桑心了~~

看看数据库编码show variables like “%char%” ,发现只有在character_set_server的时候是gbk类型,所以如果这个设置成utf-8可以解决这编码转换的问题,如果不设置这个,解决的方法如下,在每次插入之前进行,connection.query(“set names utf8;”);//重新设置一下编码类型,这样插入的类型就是对应的类型,完美结束

回到顶部