Sto memorizzando gli indirizzi IPv6 come BINARY(16)
e cercando di cercarli attraverso la rappresentazione esadecimale, ad esempio: FFFFFFFF000000000000000000000000
.Perché questa conversione da stringa a binario non funziona?
Questo funziona:
SELECT * FROM ipv6 WHERE HEX(address) = 'FFFFFFFF000000000000000000000000'
Tuttavia, questo non lo fa:
SELECT * FROM ipv6 WHERE address = CONV('FFFFFFFF000000000000000000000000', 16, 2)
Nessun messaggio di errore, solo non restituisce alcun risultato. MySQL non è in grado di gestire la conversione utilizzando CONV()
?
Potrei utilizzare la prima opzione, ma immagino che la seconda opzione sia molto più veloce in un database di grandi dimensioni in quanto non è necessario convertire tutti gli indirizzi nella tabella.
Aggiornamento:
UNHEX()
sembra funzionare grande come sottolineato da Jack. Le conversioni standard (a partire da 5.6) che utilizzano CONV()
sembrano massimi a 8 byte (64 bit) o in forma esadecimale FFFFFFFFFFFFFFFF
in modo che non possa gestire un indirizzo IPv6 completo a 128 bit.
Dopo alcune riflessioni, credo che la risposta di Salman sia il modo migliore per gestire gli esadecimali (utilizzando letterali esadecimali). Tuttavia, è necessario unhex()
, afaik, se si utilizza il bind del parametro in PHP poiché le virgolette verranno aggiunte e impedirà a MySQL di valutarlo come una stringa letterale rispetto a una stringa char.
Quindi dovrai scegliere la soluzione migliore per te. I valori letterali esadecimali sono un po 'più veloci, ma se si sta gestendo l'input dell'utente, non disporne il binding dei parametri potrebbe essere la soluzione migliore.
Si prega di dare un esempio di stessi valori si sta salvando, e come si' reinserendoli – Bohemian