Dois-je utiliser varchar(36) ou existe-t-il une meilleure façon de procéder ?
Réponses
Trop de publicités?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.
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.
"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.