2014-11-09 4 views
0

저는 node-mysql2를 사용하고 MySQL에 문자열 인코딩 된 바이너리 데이터를 저장하고 있습니다. 열의 유형은 binary(16)입니다. MySQL의에 저장된 데이터는 예를 들어, 손상되고 :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; 
} 

실제로 바이너리 데이터 (바이트가되는 각 문자를) 인코딩 된 문자열 노드를 사용하여 MySQL의에 저장하는 방법 -mysql2?

답변

1

원시 이진 문자열이지만 UTF-8 인코딩 된 문자열은 삽입하지 않습니다. UTF-8에서는 127 이후의 코드 포인트가 다중 바이트를 사용하여 인코딩됩니다. 다섯 번째 바이트 ed (237)은 2 바이트를 사용하여 인코딩됩니다.

Buffer(String.fromCharCode(0xed))는 생산 : <Buffer c3 ad>

이 문제를 해결해야 바이너리 인코딩과 버퍼로 임의의 문자열을 보내기. node-mysql은 삽입 할 때 버퍼를 16 진수 문자열로 변환합니다.

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

또한 crypto 모듈 N 바이트 난수를 생성하는 방법 randomBytes있다.

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