存储MySQL GUID / UUID

时间:2009-02-13 18:27:40

标签: mysql binary guid uuid

这是我将UUID()生成的MySQL GUID / UUID转换为二进制(16)的最佳方法:

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

然后将其存储在BINARY(16)

这样做会产生什么影响,我应该知道吗?

3 个答案:

答案 0 :(得分:8)

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

无论如何,

UNIQUEIDENTIFIER在内部存储为16-byte binary

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

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

答案 1 :(得分:2)

从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)值。

select dno
     , count(*)
     , count(case when gender = 'female' then 1 end) as female_staff
     , round(100 * count(case when gender = 'female' then 1 end) / count(*)) as female_percentage
from   employee
group by dno;

       DNO   COUNT(*) FEMALE_STAFF FEMALE_PERCENTAGE
---------- ---------- ------------ -----------------
         1          4            1                25
         2          4            3                75
         3          6            0                 0

<强> DB-Fiddle.com Demo

答案 2 :(得分:-5)

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