今天看啥
热点:

问题提出

看了一个性能对比的文章,根据实际情况,决定采用mysql-native作为项目的数据库连接器。
使用npm install mysql-native非常顺利
 
做了简单的测试连接
[html]  
mysql = require('mysql-native')  
 
[html] 
dbConn =  mysql.createTCPClient('******');  
    dbConn.auto_prepare = true;  
    var auth = dbConn.auth('****', '***','****');  //库名,用户名和密码  
    dbConn.set('row_as_hash', false);  
 
通过mysql的show processlist,能够看到连接是正常的。
第一件事情,自然是要测试中文的读写,建立一张test_cn的表。
考虑到各个操作系统的兼容性,项目的数据库都配置为UTF-8。
 
[html]  
CREATE TABLE `test_cn` (  
  `aa` varchar(20) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=utf8  
 
写入代码
[html]  
var sql= "insert into test_cn(aa)values('我')";  
dbConn.query(sql);  
 
设置字符集
 
发现是乱码,百度按照  https://github.com/vfasky/node-mysql-sexy-query/commit/a2bd1bb5fba923ced3a832d584f2a8f3205b5563  说的
增加
[html 
dbConn.set('charset' , 'utf8_general_cs');  
 
重新执行,发现还是乱码,怀疑没有生效
 
修改mysql-native代码使其生效
然后直接进入到   node_modules/mysql_native/lib下查看代码
定位到:auth.js中读取了charset的设置,line 67
[html]  
this.client.charset = this.client.get('charset') ?  
  Charset.by_name( this.client.get('charset') ) :  
  Charset.by_number( c.serverStatus.serverLanguage );  
 
可是在query.js line:105行,发现this.connection.charset是空的,于是  将
[html]  
this.client.charset = this.client.get('charset') ? ..............  
修改[非常关键]
[html]  
          this.client.connection.charset = this.client.get('charset') ?  
            Charset.by_name( this.client.get('charset') ) :  
            Charset.by_number( c.serverStatus.serverLanguage );  
  
  
<span style="white-space:pre">      </span>   this.client.charset = this.client.get('charset') ?  
            Charset.by_name( this.client.get('charset') ) :  
            Charset.by_number( c.serverStatus.serverLanguage );  
也就是将client和connection的字符集合都替换掉.
终于看到执行了charset.js的方法
可是执行发现,还是乱码
查看MYSQL连接属性
 
[html]  
var d = dbConn.query("show variables like '%char%'");  
function dump_rows(cmd)  
{  
   cmd.addListener('row', function(r) { console.dir(r); } );  
}  
  
dump_rows(d);  
 
 
从输出发现,
[html]  
[ 'character_set_client', 'latin1' ]  
[ 'character_set_connection', 'latin1' ]  
[ 'character_set_database', 'utf8' ]  
[ 'character_set_filesystem', 'binary' ]  
[ 'character_set_results', 'latin1' ]  
[ 'character_set_server', 'utf8' ]  
[ 'character_set_system', 'utf8' ]  
 
从而定位到问题,mysql服务端认为mysql-native模块连接的是基于latin1,因此
 
[html]  
dbConn.query("SET character_set_client=utf8,character_set_connection=utf8");  
 
写入中文正确。

www.bkjia.comtruehttp://www.bkjia.com/Javascript/505697.htmlTechArticle问题提出 看了一个性能对比的文章,根据实际情况,决定采用mysql-native作为项目的数据库连接器。 使用npm install mysql-native非常顺利 做了简...

相关文章

    暂无相关文章
相关搜索:

帮客评论

视觉看点