sql >> Base de Datos >  >> RDS >> Mysql

Inserción y selección de UUID como binario(16)

Entonces, como respuesta a los comentarios. La forma correcta de almacenar un UUID de 36 caracteres como binario (16) es realizar la inserción de la siguiente manera:

INSERT INTO sometable (UUID) VALUES
       (UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f", "-","")))

UNHEX porque un UUID ya es un valor hexadecimal. Recortamos (REPLACE ) los guiones en la declaración para reducir la longitud a 32 caracteres (nuestros 16 bytes representados como HEX ). Puede hacer esto en cualquier momento antes de almacenarlo, obviamente, para que no tenga que ser manejado por la base de datos.

Puede recuperar el UUID de esta manera:

SELECT HEX(UUID) FROM sometable;

En caso de que alguien se encuentre con este hilo y no esté seguro de cómo funciona.

Y recuerda:si estás seleccionando una fila usando el UUID, usa UNHEX() en la condición :

SELECT * FROM sometable WHERE UUID = UNHEX('3f06af63a93c11e4979700505690773f');

o notación literal (como lo menciona Alexis Wilke):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

Y NO HEX() en la columna:

SELECT * FROM sometable WHERE HEX(UUID) = '3f06af63a93c11e4979700505690773f';

La última solución, mientras funciona, requiere que MySQL HEX es todos los UUID antes de que pueda determinar qué filas coinciden. Es muy ineficiente.

Editar:si está utilizando MySQL 8, debería echar un vistazo a las funciones UUID como se menciona en la respuesta de SlyDave. Esta respuesta sigue siendo correcta, pero no optimiza los índices UUID que se pueden hacer de forma nativa usando esas funciones. Si está en