2014-09-09 11 views
6

Il progetto su cui lavoro è passato a MySQL. Le chiavi che usiamo sono stringhe UUID (come 43d597d7-2323-325a-90fc-21fa5947b9f3), ma il campo del database, piuttosto che una stringa, è definito come binario (16) - binario senza segno a 16 byte.Converti UUID in/da binario nel nodo

Capisco che un UUID è fondamentalmente un binario a 16 byte, ma non ho idea di come convertire da/a un numero binario.

Sto utilizzando node-mysql per accedere al database e ho provato a utilizzare node-uuid per analizzare l'UUID, ma questo produce un array di numeri interi. Ho anche provato a usare Node's Buffer, ma questo produce solo un oggetto buffer.

Come si converte una stringa UUID per adattarla a tale campo? E come posso convertire un valore che ho letto da quel campo in un UUID?

+0

La [ 'HEX()'] (http://dev.mysql.com/doc/refman/5.5/en /string-functions.html#function_hex) dovrebbe funzionare molto vicino. – tadman

+0

la matrice di interi che hai menzionato potrebbe essere quello che vuoi, dopo averli convertiti in una stringa usando n .toString (16) – dandavis

+0

@dandavis la prima cosa che ho provato è stata: rimuovere i trattini da x, 'y = parseInt (x, 16) '-> produce un grande numero (come 9.2230 ... e + 31), ma poi' y.toString (16) 'restituisce un numero completamente diverso. JavaScript non può gestire un pozzo di precisione a 16 byte e probabilmente sta perdendo cifre significative nella conversione. –

risposta

3

A causa della mancanza di tempo, incollo il commento che ha fornito risultati validi e modifica la risposta più tardi in modo che sia più chiara.


destro, se si dispone di un UUID 43d597d7-2323-325a-90fc-21fa5947b9f3 in quel formato stringa già presente nella JS app, devi inviare la seguente query per MySQL:

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

Se si vuole tirare fuori i dati e avere UUID in formato leggibile, devi convertirlo in notazione esadecimale.

SELECT HEX(uuid_col) FROM table;

Quello vi darà l'UUID senza trattini. Sembra che il metodo node-uuid.parse funzioni se gli dai una stringa esadecimale senza trattini.

+0

Che modulo del nodo è questo. È questo che ti stai riferendo https://github.com/kelektiv/node-uuid? Non ha un metodo di analisi. –

+0

@MustafaMamun [Mi riferisco al modulo che OP ha menzionato nella sua domanda] (https://github.com/defunctzombie/node-uuid) –

2

Mentre la risposta di N.B. funziona, sono incappato in un'altra soluzione.

UUID v1 inizia con segmenti di carattere basati sul tempo; tuttavia, le unità più piccole vengono prima a fare una distribuzione piuttosto sparsa in un indice.

Se non si è bloccati nel preciso formato UUID v1 di quello che esiste un modulo NodeJS in grado di generare ID univoci basati su UUID v1 che aumentano e ridimensionano anche monotonicamente come ID auto incrementati. Funziona anche con node-mysql.

Cassa: monotonic-id

Un esempio con il nodo-mysql:

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

var mid = new MID(); 

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