首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储在MySQL中的二进制数据因节点而损坏

存储在MySQL中的二进制数据因节点而损坏
EN

Stack Overflow用户
提问于 2014-11-09 12:15:54
回答 1查看 1.9K关注 0票数 1

我使用node-mysql2并将字符串编码的二进制数据存储在MySQL中。该列的类型为binary(16)。存储在MySQL中的数据正在损坏,例如:

代码语言:javascript
复制
NodeJS output: 47 23 43 14 ed 86 14 dc 12 f3 b8 6c dc 31 fb fa
MySQL HEX()  : 47 23 43 14 c3 ad c2 86 14 c3 9c 12 c3 b3 c2 b8

代码:

代码语言:javascript
复制
var binaryString = randomBinaryString();
db.sqlQuery("INSERT INTO test(binaryString) VALUES(" + db.escape(binaryString) + ")");
console.log(new Buffer(binaryString, 'binary').toString('hex'));

function randomBinaryString(){
    var str = "";
    for(var i = 0; i < 16; i++){
        str += String.fromCharCode(Math.floor(Math.random()*256));
    }
    return str;
}

应该如何使用node-mysql2将实际编码二进制数据(每个字符是一个字节)的字符串存储在MySQL中?

EN

回答 1

Stack Overflow用户

发布于 2014-11-09 14:02:37

您插入的不是原始的二进制字符串,而是UTF-8编码的字符串。在UTF-8中,127之后的码点使用多个字节进行编码。第五个字节ed (237)使用2个字节编码。

Buffer(String.fromCharCode(0xed))产品:<Buffer c3 ad>

使用二进制编码将随机字符串作为缓冲区发送应该可以解决此问题。插入时,node-mysql会将缓冲区转换为十六进制字符串。

代码语言:javascript
复制
db.query('INSERT INTO test VALUES (?)', [ Buffer(randomString(), 'binary') ]);

此外,crypto模块有一个生成n个随机字节的randomBytes方法。

代码语言:javascript
复制
db.query('INSERT INTO test VALUES (?)', [crypto.randomBytes(16)]);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26824943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档