Dans MySQL/MariaDB, le moyen le plus efficace de stocker uuid est une colonne BINARY (16). Cependant, vous souhaitez parfois l’obtenir sous forme de chaîne uuid formatée.
Étant donné la structure de tableau suivante, comment pourrais-je obtenir tous les uuids de manière formatée par défaut?
CREATE TABLE foo (uuid BINARY(16));
Ce qui suit créerait le résultat que j'étais après:
SELECT
LOWER(CONCAT(
SUBSTR(HEX(uuid), 1, 8), '-',
SUBSTR(HEX(uuid), 9, 4), '-',
SUBSTR(HEX(uuid), 13, 4), '-',
SUBSTR(HEX(uuid), 17, 4), '-',
SUBSTR(HEX(uuid), 21)
))
FROM foo;
MySQL 8 ajoute deux nouvelles fonctions UUID :
Alors:
SELECT BIN_TO_UUID(uuid) FROM foo
Dans les versions antérieures (antérieures à 8), vous pouvez créer une fonction function dans MySQL comme suit:
CREATE
FUNCTION uuid_of(uuid BINARY(16))
RETURNS VARCHAR(36)
RETURN LOWER(CONCAT(
SUBSTR(HEX(uuid), 1, 8), '-',
SUBSTR(HEX(uuid), 9, 4), '-',
SUBSTR(HEX(uuid), 13, 4), '-',
SUBSTR(HEX(uuid), 17, 4), '-',
SUBSTR(HEX(uuid), 21)
));
Et ensuite, utilisez-le simplement dans vos requêtes:
SELECT
uuid_of(id)
name,
age
FROM users
Et cela produit:
(c6f5703b-fec2-43fd-8f45-45f06583d450, un nom, 20)
Le résultat correct est généré par le script ci-dessous, les autres scripts ont généré un UUID mais pas le bon.
CONCAT(
substr(hex(Id), 7, 2), substr(hex(Id), 5, 2), substr(hex(Id), 3, 2), substr(hex(Id), 1, 2), '-'
, substr(hex(Id), 11, 2) , substr(hex(Id), 9, 2) , '-'
, substr(hex(Id), 15, 2) , substr(hex(Id), 13, 2) , '-'
, substr(hex(Id), 17, 4) , '-'
, substr(hex(Id), 21, 12)
)
Les résultats exécutés avec les autres scripts ont généré un UUID incorrect, comme indiqué ci-dessous:
2e9660c2-1e51-4b9e-9a86-6db1a2770422
c260962e-511e-9e4b-9a86-6db1a2770422
Comme vous pouvez le constater, ils sont différents.
Stocker l'uuid brut dans une variable @x
SELECT @x := hex(uuid)
FROM foo;
Utilisez CONCAT_WS et SUBSTR pour analyser l'UUID lisible par l'homme
SELECT
LOWER(CONCAT_WS('-',
SUBSTR(@x, 1, 8),
SUBSTR(@x, 9, 4),
SUBSTR(@x, 13, 4),
SUBSTR(@x, 17, 4),
SUBSTR(@x, 21)
)) AS uuid;