存储在MySQL中的二进制数据正在被Node损坏

时间:2014-11-09 04:15:54

标签: mysql node.js node-mysql

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

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

代码:

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中?

1 个答案:

答案 0 :(得分:2)

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

Buffer(String.fromCharCode(0xed))生成:<Buffer c3 ad>

将随机字符串作为具有二进制编码的缓冲区发送应解决问题。 node-mysql将在插入时将缓冲区转换为十六进制字符串。

db.query('INSERT INTO test VALUES (?)', [ Buffer(randomString(), 'binary') ]);

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

db.query('INSERT INTO test VALUES (?)', [crypto.randomBytes(16)]);