所以,作为对 comments 的回应.将36个字符的UUID存储为二进制(16)的正确方法是以如下方式执行插入:
INSERT INTO sometable (UUID) VALUES
(UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f", "-","")))
UNHEX
,因为UUID已经是hexed值.我们修剪(REPLACE
)语句中的破折号,将长度减少到32个字符(16个字节表示为HEX
).显然,您可以在存储之前的任何时候执行此操作,因此不必由数据库处理.
您可以如下方式检索UUID:
SELECT HEX(UUID) FROM sometable;
以防有人遇到这个问题,不确定这是怎么回事.
记住:如果使用UUID Select 一行,use 100 on the condition:
SELECT * FROM sometable WHERE UUID = UNHEX('3f06af63a93c11e4979700505690773f');
或literal notation(如Alexis Wilke所述):
SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;
And NOT 100on the column:
SELECT * FROM sometable WHERE HEX(UUID) = '3f06af63a93c11e4979700505690773f';
最后一个解决方案虽然有效,但要求MySQL在确定哪些行匹配之前先删除所有UUID.效率很低.
编辑:如果你使用的是MySQL 8,你应该看看SlyDave回答中提到的UUID函数.这个答案仍然是正确的,但它并没有优化UUID索引,而UUID索引可以通过这些函数本机完成.如果你在<;MySQL 8您可以实现Devon的polyfill,它在以前版本的MySQL上提供相同的功能.