如何在MySQL/MariaDB中从二进制列格式化uuid字符串

Lil*_*man 22 mysql uuid mariadb

在MySQL/MariaDB中,存储uuid的最有效方法是在BINARY(16)列中.但是,有时您希望将其作为格式化的uuid字符串获取.

鉴于以下表结构,我将如何以默认格式化方式获取所有uuids?

CREATE TABLE foo (uuid BINARY(16));
Run Code Online (Sandbox Code Playgroud)

Lil*_*man 44

以下将创建我之后的结果:

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;
Run Code Online (Sandbox Code Playgroud)

  • 请参阅 Oleg Mikheev 的回答,现在使用 BIN_TO_UUID() 在 mysql 8.0 中更容易做到 (4认同)

Ole*_*eev 10

MySQL 8增加了两个新的UUID功能:

所以:

SELECT BIN_TO_UUID(uuid) FROM foo
Run Code Online (Sandbox Code Playgroud)


zay*_*uan 6

如果您正在寻找相反的内容,即如何从字符串转换为二进制,也许是为了进行连接或其他操作,请参见此处:Convert UUID to/from binary in Node

这段在 Mysql 5.7 上运行的 SQL 帮助我锁定了这个概念:

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)
  ))
Run Code Online (Sandbox Code Playgroud)

输出是43d597d7-2323-325a-90fc-21fa5947b9f3

字符串 -> 二进制

所以,UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))到时的UUID转换为二进制的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)
))
Run Code Online (Sandbox Code Playgroud)


And*_*mov 5

在早期版本(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)
));
Run Code Online (Sandbox Code Playgroud)

然后只需在查询中使用它即可:

SELECT
  uuid_of(id)
  name,
  age
FROM users
Run Code Online (Sandbox Code Playgroud)

它产生:

(c6f5703b-fec2-43fd-8f45-45f06583d450,某些名称,20)