Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion et sélection d'UUID en binaire(16)

Donc, en réponse aux commentaires. La manière correcte de stocker un UUID de 36 caractères en tant que binary(16) consiste à effectuer l'insertion d'une manière telle que :

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

UNHEX car un UUID est déjà une valeur hexadécimale. Nous coupons (REPLACE ) les tirets dans l'instruction pour ramener la longueur à 32 caractères (nos 16 octets représentés par HEX ). Vous pouvez le faire à tout moment avant de le stocker, évidemment, afin qu'il n'ait pas à être géré par la base de données.

Vous pouvez récupérer l'UUID comme ceci :

SELECT HEX(UUID) FROM sometable;

Juste au cas où quelqu'un tomberait sur ce fil et ne serait pas sûr de son fonctionnement.

Et n'oubliez pas :si vous sélectionnez une ligne à l'aide de l'UUID, utilisez UNHEX() à condition :

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

ou notation littérale (tel que mentionné par Alexis Wilke):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

Et PAS HEX() sur la colonne :

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

La dernière solution, bien qu'elle fonctionne, nécessite que MySQL HEX es tous les UUID avant de pouvoir déterminer quelles lignes correspondent. C'est très inefficace.

Edit :Si vous utilisez MySQL 8, vous devriez jeter un œil aux fonctions UUID comme mentionné dans la réponse de SlyDave. Cette réponse est toujours correcte, mais elle n'optimise pas les index UUID qui peuvent être effectués nativement à l'aide de ces fonctions. Si vous êtes sur