这是我将UUID()生成的MySQL GUID / UUID转换为二进制(16)的最佳方法:
UNHEX(REPLACE(UUID(),'-',''))
然后将其存储在BINARY(16)
中这样做会产生什么影响,我应该知道吗?
答案 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/