存储MySQL GUID / UUID
这是我可以将由UUID()生成的MySQL GUID / UUID转换为二进制文件(16)的最佳方式:
UNHEX(REPLACE(UUID(),'-',''))
然后将其存储在BINARY(16)
这样做是否有任何影响,我应该知道?
没有太多的影响。 它会减慢查询的速度,但您几乎不会注意到它。
无论如何, UNIQUEIDENTIFIER
在内部都以16-byte binary
形式存储。
如果要将二进制文件加载到客户端并解析它,请记下bit order
,它可能具有比初始NEWID()
其他字符串表示形式。
Oracle
的SYS_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