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
'it-source' 카테고리의 다른 글
HTML 버튼을 사용하여 JavaScript 함수 호출 (0) | 2022.10.30 |
---|---|
어레이에서 변경 가능한 목록을 작성하시겠습니까? (0) | 2022.10.30 |
뷰에서 테이블 언더레이의 기본 키를 취득하다 (0) | 2022.10.21 |
JShell을 종료하고 명령줄로 돌아가려면 어떻게 해야 합니까? (0) | 2022.10.21 |
DIV의 내용을 인쇄합니다. (0) | 2022.10.21 |