各位好,数据库中应用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了,我在想是不是这一步出了问题。有遇到的大神给个答复。小女子谢过。
好吧,我自己回答。原来nodejs mysql目前不支持gbk,纠结了那么久,结果把所有的改成一致的utf8所有的问题就解决了,太桑心了~~
看看数据库编码show variables like “%char%” ,发现只有在character_set_server的时候是gbk类型,所以如果这个设置成utf-8可以解决这编码转换的问题,如果不设置这个,解决的方法如下,在每次插入之前进行,connection.query(“set names utf8;”);//重新设置一下编码类型,这样插入的类型就是对应的类型,完美结束