it-source

MySQL/MariaDB의 이진 열에서 UUID 문자열을 포맷하는 방법

criticalcode 2022. 10. 21. 22:58
반응형

MySQL/MariaDB의 이진 열에서 UUID 문자열을 포맷하는 방법

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;

MySQL 8에는 두 가지 새로운 UUID 기능이 추가되었습니다.

  • UUID_TO_B입력
  • BIN_TO_UUID - 이것이 당신이 찾고 있는 것입니다.

그래서:

SELECT BIN_TO_UUID(uuid) FROM foo

이전 버전(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, Some name, 20)

문자열에서 바이너리로 변환하는 방법, 예를 들어 조인 등의 방법을 찾고 있는 경우, 여기서 설명합니다.노드의 바이너리에서 바이너리로 UUID 변환

이 SQL은 Mysql 5.7에서 실행되어 컨셉을 확정하는 데 도움이 되었습니다.

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.

string -> 바이너리

그렇게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)
))

다음 스크립트에 의해 올바른 결과가 생성되고 다른 스크립트는 UUID를 생성하지만 올바른 스크립트는 생성되지 않습니다.

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가 생성되었습니다.

  • 예상 UUID -2e9660c2-1e51-4b9e-9a86-6db1a2770422
  • 생성된 내용 -c260962e-511e-9e4b-9a86-6db1a2770422

보다시피 그들은 다르다.

다음은 concat_ws를 사용하는 대체 방법입니다.

원시 UUID를 변수 @x에 저장합니다.

SELECT @x := hex(uuid)
FROM foo;

CONCAT_WS 및 SLOBT를 사용하여 사람이 읽을 수 있는 UUID 구문 분석

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;

이 Jira 티켓에 따르면 https://jira.mariadb.org/browse/MDEV-15854 UUID_TO_BIN 및 BIN_TO_UUID는 Mariadb Server 릴리즈 10.5에 포함되지 않았습니다.이 버전 및 Mariadb Server 아래에서 사용하는 경우 위에서 설명한 커스텀 구현을 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/37168797/how-to-format-uuid-string-from-binary-column-in-mysql-mariadb

반응형