141 votes

Comment dois-je stocker les GUID dans les tables MySQL ?

Dois-je utiliser varchar(36) ou existe-t-il une meilleure façon de procéder ?

102voto

thaBadDawg Points 2951

Lorsque je me suis renseigné sur la meilleure façon de stocker les GUID de mes objets, mon DBA m'a demandé pourquoi j'avais besoin de stocker 16 octets alors que je pouvais faire la même chose en 4 octets avec un entier. Comme il m'a lancé ce défi, j'ai pensé que c'était le bon moment pour le mentionner. Ceci étant dit...

Vous pouvez stocker un guid comme un binaire CHAR(16) si vous voulez faire l'utilisation la plus optimale de l'espace de stockage.

42voto

Brian Fisher Points 10755

Je le stockerai comme un char(36).

32voto

KCD Points 1566

En complément de la réponse de ThaBadDawg, utilisez ces fonctions pratiques (grâce à un de mes collègues les plus avisés) pour transformer une chaîne de 36 caractères en un tableau de 16 octets.

DELIMITER $$

CREATE FUNCTION `GuidToBinary`(
    $Data VARCHAR(36)
) RETURNS binary(16)
BEGIN
    DECLARE $Result BINARY(16) DEFAULT NULL;
    IF $Data IS NOT NULL THEN
        SET $Data = REPLACE($Data,'-','');
        SET $Result = CONCAT(UNHEX(SUBSTRING($Data,7,2)),UNHEX(SUBSTRING($Data,5,2)),UNHEX(SUBSTRING($Data,3,2)), UNHEX(SUBSTRING($Data,1,2)),
                UNHEX(SUBSTRING($Data,11,2)),UNHEX(SUBSTRING($Data,9,2)),UNHEX(SUBSTRING($Data,15,2)) , UNHEX(SUBSTRING($Data,13,2)),
                UNHEX(SUBSTRING($Data,17,16)));
    END IF;
    RETURN $Result;
END

$$

CREATE FUNCTION `ToGuid`(
    $Data BINARY(16)
) RETURNS char(36) CHARSET utf8
BEGIN
    DECLARE $Result CHAR(36) DEFAULT NULL;
    IF $Data IS NOT NULL THEN
        SET $Result = CONCAT(HEX(SUBSTRING($Data,4,1)),HEX(SUBSTRING($Data,3,1)),HEX(SUBSTRING($Data,2,1)), HEX(SUBSTRING($Data,1,1)) , '-', 
                HEX(SUBSTRING($Data,6,1)),HEX(SUBSTRING($Data,5,1)),'-',
                HEX(SUBSTRING($Data,8,1)) , HEX(SUBSTRING($Data,7,1)),'-',
                HEX(SUBSTRING($Data,9,2)),'-',HEX(SUBSTRING($Data,11,6)));
    END IF;
    RETURN $Result;
END

CHAR(16) est en fait un BINARY(16), choisissez la saveur qui vous convient.

25voto

Learning Points 5386

Char(36) serait un bon choix. Il est également possible d'utiliser la fonction UUID() de MySQL qui renvoie un format texte de 36 caractères (hexadécimal avec tirets) qui peut être utilisé pour récupérer ces identifiants dans la base de données.

18voto

candu Points 397

"Meilleur" dépend de ce pour quoi vous optimisez.

Quelle importance accordez-vous à la taille et aux performances du stockage par rapport à la facilité de développement ? Plus important encore, générez-vous suffisamment de GUIDs, ou les récupérez-vous assez fréquemment, pour que cela ait de l'importance ?

Si la réponse est "non", char(36) est plus que suffisant, et il rend le stockage/la récupération des GUIDs très simple. Autrement, binary(16) est raisonnable, mais vous devrez vous appuyer sur MySQL et/ou sur le langage de programmation de votre choix pour convertir la représentation habituelle des chaînes de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X