[英]Storing MySQL GUID/UUIDs
这是我将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;
我将它散列为一个8字节的整数,并使用像MurmurHash64A这样的低冲突高效单向散列算法存储整数。 这使用了更少的空间,可以对其进行索引和/或分区。 有一个SourceForge项目包含mySQL的MemCached函数( http://forge.mysql.com/projects/project.php?id=250 ),其中可能包含MurmurHash64A,因为Memchached使用它,但我不知道。 或者看看这个FNV for mySQL的实现: http ://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.