我正在使用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中?
答案 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)]);