存储MySQL GUID / UUID

这是我可以将由UUID()生成的MySQL GUID / UUID转换为二进制文件(16)的最佳方式:

UNHEX(REPLACE(UUID(),'-',''))

然后将其存储在BINARY(16)

这样做是否有任何影响,我应该知道?


没有太多的影响。 它会减慢查询的速度,但您几乎不会注意到它。

无论如何, UNIQUEIDENTIFIER在内部都以16-byte binary形式存储。

如果要将二进制文件加载到客户端并解析它,请记下bit order ,它可能具有比初始NEWID()其他字符串表示形式。

OracleSYS_GUID()函数很容易出现此问题,将其转换为字符串会在客户端和服务器上给出不同的结果。


从MySQL 8.0及更高版本中,您可以使用UUID_TO_BIN:

UUID_TO_BIN(string_uuid) ,UUID_TO_BIN(string_uuid,swap_flag)

将字符串UUID转换为二进制UUID并返回结果。 (IS_UUID()函数描述列出了允许的字符串UUID格式。)返回二进制UUID是一个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;

DB-Fiddle.com演示


我将它散列成一个8字节的整数,并使用像MurmurHash64A这样的低冲突高效率单向散列算法来存储整数。 这使用了很少的空间,并且可以进行索引和/或分区。 有一个SourceForge项目,包括MemSQL的MemCached函数(http://forge.mysql.com/projects/project.php?id=250),可能包括MurmurHash64A,因为Memchached使用它,但我不知道。 或者查看mySQL的FNV实现:http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/

链接地址: http://www.djcxy.com/p/16263.html

上一篇: Storing MySQL GUID/UUIDs

下一篇: How to create a GUID/UUID in Python