2014-09-09 3 views
6

내가하는 프로젝트가 MySQL로 전환되었습니다. 우리가 사용하는 키는 43d597d7-2323-325a-90fc-21fa5947b9f3과 같은 UUID 문자열이지만 문자열이 아닌 데이터베이스 필드는 16 진수 - 16 바이트 부호없는 2 진수로 정의됩니다.노드에서 UUID를 바이너리로 변환

UUID는 기본적으로 16 바이트 바이너리라는 것을 알고 있지만 바이너리 숫자로 변환하는 방법을 모릅니다.

데이터베이스에 액세스하는 데 node-mysql을 사용하고 있으며 node-uuid을 사용하여 UUID를 구문 분석했지만 정수 배열을 생성했습니다. 또한 Node's Buffer을 사용해 보았지만 버퍼 객체 만 생성됩니다.

어떻게 필드에 맞게 UUID 문자열을 변환합니까? 그리고 그 필드에서 읽은 값을 UUID로 바꾸려면 어떻게해야합니까?

+0

에서 [HEX '()'(http://dev.mysql.com/doc/refman/5.5/en /string-functions.html#function_hex) 함수를 사용하면 꽤 가깝습니다. – tadman

+0

당신이 언급 한 정수 배열은 n .toString (16) – dandavis

+0

@dandavis를 사용하여 문자열로 다시 변환 한 후 원하는대로 될 수 있습니다. 시도한 첫 번째 작업은 다음과 같습니다. x에서 대시를 제거합니다. 'y = parseInt (x, 16)'->는 9.2230 ... e + 31과 같이 많은 수를 출력하지만,'y.toString (16)'은 완전히 다른 수를 반환합니다. JavaScript는 16 바이트 정밀도를 제대로 처리 할 수 ​​없으며 변환에서 유효 숫자가 손실 될 가능성이 큽니다. –

답변

3

시간이 부족하기 때문에 유효한 결과를 제공하는 설명을 붙여넣고 나중에 대답을 수정하여 명확하게 나타냅니다. 당신이 당신의 JS 응용 프로그램에서 이미 문자열 형식으로 UUID 43d597d7-2323-325a-90fc-21fa5947b9f3이있는 경우


오른쪽, 당신은 MySQL로 다음 쿼리를 보낼 것 :

SELECT col FROM table WHERE uuid_col = UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''));

아웃 데이터를 가져하려면 UUID가 읽기 쉬운 형식이면 16 진수 표기법으로 변환해야합니다. 하나의 대시없이 당신에게 UUID를 줄 것이다

SELECT HEX(uuid_col) FROM table;

. node-uuid.parse 메서드는 대시없이 16 진수 문자열을 지정하면 작동하는 것으로 보입니다.

+0

어떤 노드 모듈입니까? 이게 당신이 말하는 https://github.com/kelektiv/node-uuid입니까? 구문 분석 메서드가 없습니다. –

+0

@MustafaMamun [OP가 그의 질문에서 언급 한 모듈을 언급하고 있습니다] (https://github.com/defunctzombie/node-uuid) –

2

N.B.의 대답이 작동하는 동안 나는 다른 해결책을 발견했습니다.

UUID v1은 시간 기반 문자 세그먼트로 시작합니다. 그러나 가장 작은 단위가 먼저 색인으로 분산되어 배포됩니다.

정확하지 않은 UUID v1 형식을 사용하는 경우 UJID v1을 기반으로 고유 ID를 생성 할 수있는 NodeJS 모듈보다 자동 증가 ID뿐 아니라 단조 증가 및 배율 조정이 가능합니다. 또한 node-mysql과 함께 작동합니다.

지갑 :와 monotonic-id

일례 노드의 MySQL :

var MID = require('monotonic-id'); 

var mid = new MID(); 

client.query('INSERT INTO `...` SET `mid`=?', mid.toBuffer(), function(err, res) { 
    ... 
}) 
관련 문제