我使用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中?
发布于 2014-11-09 14:02:37
您插入的不是原始的二进制字符串,而是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模块有一个生成n个随机字节的randomBytes方法。
db.query('INSERT INTO test VALUES (?)', [crypto.randomBytes(16)]);https://stackoverflow.com/questions/26824943
复制相似问题