在MySQL/MariaDB中,存储uuid最有效的方式是使用BINARY(16)列。然而,有时您希望将其作为格式化的uuid字符串获取。
给定以下表结构,如何以默认格式获取所有uuid?
CREATE TABLE foo (uuid BINARY(16));
以下内容会得到我想要的结果:
SELECT
LOWER(CONCAT(
SUBSTR(HEX(uuid), 1, 8), '-',
SUBSTR(HEX(uuid), 9, 4), '-',
SUBSTR(HEX(uuid), 13, 4), '-',
SUBSTR(HEX(uuid), 17, 4), '-',
SUBSTR(HEX(uuid), 21)
))
FROM foo;
HEX(uuid)
操作,最好先执行 SET @hex = (SELECT LOWER(HEX(bytes)));
,然后引用 @hex
5 次,也跳过 LOWER()
的包含。 - Liviu ChircuBIN_TO_UUID(<fieldName>)
,这将确认它。虽然,如果你必须这样做,你可能已经传递了 true
标志到 UUID_TO_BIN
,因此你还需要使用它来获取正确的 UUID。即 BIN_TO_UUID( <fieldName>, true )
。 - Native Coder在早期版本中(8之前),您可以像以下示例一样在MySQL中创建函数:
CREATE
FUNCTION uuid_of(uuid BINARY(16))
RETURNS VARCHAR(36)
RETURN LOWER(CONCAT(
SUBSTR(HEX(uuid), 1, 8), '-',
SUBSTR(HEX(uuid), 9, 4), '-',
SUBSTR(HEX(uuid), 13, 4), '-',
SUBSTR(HEX(uuid), 17, 4), '-',
SUBSTR(HEX(uuid), 21)
));
然后在你的查询中简单地使用它:
SELECT
uuid_of(id)
name,
age
FROM users
它会产生以下结果:
(c6f5703b-fec2-43fd-8f45-45f06583d450, 某个名字, 20)
SELECT hex(uuid_column) FROM ${table}
,然后再执行 SELECT uuid_of(uuid_column) FROM ${table}
。 - Andrii Abramovhex(myId)
和uuid_of(uuid_column)
实际上是一样的C260962E511E9E4B9A866DB1A2770422
和c260962e-511e-9e4b-9a86-6db1a2770422
,但我认为它并不是我的MVC应用程序生成并保存到数据库中的ID。它生成了2E9660C2-1E51-4B9E-9A86-6DB1A2770422
,而保存为C260962E511E9E4B9A866DB1A2770422
。这可能是因为我正在使用MySQL EF Adapter的问题,因为如果我使用从uuid_of
获取的UUID查询任何内容,我就无法获取任何内容,但如果我使用我上面发布的函数获取UUID,则可以获取记录。 - Alexz S.SELECT
LOWER(CONCAT(
SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 1, 8), '-',
SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 9, 4), '-',
SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 13, 4), '-',
SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 17, 4), '-',
SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 21)
))
43d597d7-2323-325a-90fc-21fa5947b9f3
。UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))
在INSERT
/UPDATE
/JOIN
/SELECT
中进行操作。LOWER(CONCAT(
SUBSTR(HEX(uuid), 1, 8), '-',
SUBSTR(HEX(uuid), 9, 4), '-',
SUBSTR(HEX(uuid), 13, 4), '-',
SUBSTR(HEX(uuid), 17, 4), '-',
SUBSTR(HEX(uuid), 21)
))
CONCAT(
substr(hex(Id), 7, 2), substr(hex(Id), 5, 2), substr(hex(Id), 3, 2), substr(hex(Id), 1, 2), '-'
, substr(hex(Id), 11, 2) , substr(hex(Id), 9, 2) , '-'
, substr(hex(Id), 15, 2) , substr(hex(Id), 13, 2) , '-'
, substr(hex(Id), 17, 4) , '-'
, substr(hex(Id), 21, 12)
)
运行其他脚本生成的结果是错误的UUID,如下所示:
2e9660c2-1e51-4b9e-9a86-6db1a2770422
c260962e-511e-9e4b-9a86-6db1a2770422
你可以看到它们是不同的。
最初的回答:
将原始uuid存储在变量@x中。
SELECT @x := hex(uuid)
FROM foo;
SELECT
LOWER(CONCAT_WS('-',
SUBSTR(@x, 1, 8),
SUBSTR(@x, 9, 4),
SUBSTR(@x, 13, 4),
SUBSTR(@x, 17, 4),
SUBSTR(@x, 21)
)) AS uuid;