Stockage de MySQL GUID / UUID
Question
Ceci est la meilleure façon que je pouvais venir avec pour convertir un GUID MySQL / UUID généré par UUID () à un binaire (16):
UNHEX(REPLACE(UUID(),'-',''))
Et puis les stocker dans un BINARY (16)
Y a-t-il des implications de ce faire de cette façon que je sache de?
La solution
Peu de conséquences. Il va ralentir les requêtes un peu, mais vous remarquerez à peine.
UNIQUEIDENTIFIER
est stocké sous forme 16-byte binary
interne de toute façon.
Si vous allez charger le binaire en un client et d'analyser là, notez le bit order
, il peut avoir une autre représentation de chaîne que la NEWID()
initiale.
La fonction Oracle
de SYS_GUID()
est sujette à ce problème, en le convertissant en une chaîne donne des résultats différents sur le client et sur le serveur.
Autres conseils
De MySQL 8.0 et au-dessus, vous pouvez utiliser UUID_TO_BIN :
UUID_TO_BIN (string_uuid) , UUID_TO_BIN (string_uuid, swap_flag)
Convertit un UUID de chaîne à un UUID binaire et renvoie le résultat. (La description de la fonction IS_UUID () donne la liste des chaînes autorisées formats UUID.) Le retour UUID binaire est une valeur VARBINARY (16).
CREATE TABLE t (id binary(16) PRIMARY KEY);
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
SELECT *, BIN_TO_UUID(id) FROM t;
Je hachage en un nombre entier de 8 octets et de stocker le nombre entier en utilisant un filtre passe-collision à haute efficacité à sens unique algorithme de hachage comme MurmurHash64A. Il utilise beaucoup moins d'espace et peut être indexé et / ou cloisonnés. Il y a un projet SourceForge qui inclut des fonctions Memcached pour mySQL ( http: // forge. mysql.com/projects/project.php?id=250 ) qui pourrait inclure MurmurHash64A, puisque Memcached utilise, mais je ne sais pas. Ou regardez cette mise en œuvre de FNV pour mySQL: http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/