关于二进制文件:存储MySQL GUID / UUID

Storing MySQL GUID/UUIDs

这是我能想到的将uuid()生成的mysql guid/uuid转换为二进制(16)的最佳方法:

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

然后将其存储在二进制文件中(16)

这样做有什么我应该知道的意义吗?


影响不大。它会稍微减慢查询速度,但您几乎不会注意到。

UNIQUEIDENTIFIER在内部存储为16-byte binary

如果要将二进制文件加载到客户机中并在那里进行分析,请注意bit order,它可能有其他字符串表示形式,而不是初始的NEWID()

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


从MySQL8.0及更高版本,您可以使用uuid_to_bin:

UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuid, swap_flag)

Converts a string UUID to a binary UUID and returns the result. (The IS_UUID() function description lists the permitted string UUID formats.) The return binary UUID is a VARBINARY(16) value.

1
2
3
4
5
6
7
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字节的整数,并使用一个低冲突、高效的单向散列算法(如humbolhash64a)来存储整数。这样占用的空间更少,可以索引和/或分区。有一个sourceforge项目包含用于mysql的memcached函数(http://forge.mysql.com/projects/project.php)?id=250),可能包括杂音64a,因为Memchached使用它,但我不知道。或者看一下针对mysql的fnv实现:http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/