web-dev-qa-db-fra.com

Comment formater la chaîne uuid à partir d'une colonne binaire dans MySQL/MariaDB

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));
16
Lilleman

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;
36
Lilleman

MySQL 8 ajoute deux nouvelles fonctions UUID :

Alors:

SELECT BIN_TO_UUID(uuid) FROM foo
7
Oleg Mikheev

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)

2
Andrii Abramov

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:

  • UUID attendu - 2e9660c2-1e51-4b9e-9a86-6db1a2770422
  • Ce qui a été généré - c260962e-511e-9e4b-9a86-6db1a2770422

Comme vous pouvez le constater, ils sont différents.

0
Alex.H

Voici une alternative utilisant concat_ws

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;
0
toddsby