数据库:mysql node模块:mysql
我想压缩一段字符串,使用到了node的zlib,代码如下: var str = ‘[1,2,3,4,[1,2,3,4],6,7,8]’; zlib.gzip( str, function( err, buffer ){ db.update( table_name, { data : buffer.toString( ‘binary’ ) }, ‘id=10001’ fucntion( err, res ){} ); });
数据库的data字段数据类型我设置的为blob
然后我获取刚刚设置的数据: db.select( table_name, ‘id=10001’, function( err, res ) { var buf = res[0].data; //打印出从数据库取出的data,它的数据类型是buffer //我担心mysql库得到的buffer并不是我压缩时候的编码类型,所以我做了如下转化 var new_buf = new Buffer( buf.toString( ‘binary’ ), ‘binary’ ); //然后解压 zlib.unzip( new_buf, function( err, res ) { //这里就报错了 }) });
我看了下主要原因是,存进mysql的数据和取出来的数据不一样,不是说node_mysql已经支持binary的存储了吗,为什么还不一样,是不是底层在buffer数据了加了些东西,怎么解决这个问题,有人遇到过没
这是我在mysql模块上面的问题,里面问题错误描述更准确,https://github.com/felixge/node-mysql/issues/555#issuecomment-21480376
lz 的环境与这个人是否一致? 这个人说在这样的环境下完全没问题 mysql@2.0.0-alpha7 (and up) and it does the round-trip no problem on MySQL 5.1.
我正在找问题,呵
issue上给出的buff存储前后的数据
//Buffer 1f 8b 08 00 00 00 00 00 00 03 ab a8 00 01 00 6a 3e 40 d2 06 00 00 00
//Buffer 1f ef bf bd 08 00 00 00 00 00 00 03 ef bf bd ef bf bd 00 01 00 6a 3e 40 ef bf bd 06 00 00 00
这个结果,不是node-mysq掺入额外的数据,而是编码转换导致的,下面代码可重现前一个buffer是怎么转变为后一个buffer的。
var b='1f8b0800000000000003aba80001006a3e40d206000000';
b=new Buffer(b,'hex');
console.log('before:',b);
console.log('after:',new Buffer(b.toString('utf-8'),'utf-8'));
请确认自身代码没有在某个地方做了类似的编码转换
另外如果怀疑node-mysql出错,最好直接利用mysql的专门客户端软件导出blob字段的数据,来做前后对比。这比用自己未经测试的代码来作对比,有说服力的多。因为你没给出testcase,谁也不能确定错误究竟是来自node-mysql还是你自身的代码。
谢谢回答,终于找到问题了,我在node-mysql上还有一层封装,这里面将编码给转化了