MariaDB(MySQL)에서 대부분 PK로 AUTO_INCREMENT 값이나 UUID(Universally Unique ID) 값을 사용한다.
MariaDB에서 데이터 조회시 바이너리 형태의 UUID를 16진수 문자열로 읽을 수 있도록 변환해서 조회하는 방법을 기재한다.
MariaDB에서 UUID 조회
UUID는 다음과 같이 32개의 16진수로 구성이 되며 5개의 그룹을 하이픈(-)으로 구분하여 표기한다.
b1840eb6-7dfb-11ee-8f53-0242ac1d0002 |
UUID 크기
UUID값을 그대로 DB에 저장하게 되면 불필요한 하이픈(-) 제거하더라도 32 bytes로 계산된다.(저장 시 필요한 데이터 타입 CHAR(32))
PK값을 INT (4 bytes) 또는 BIGINT(8 bytes)로 하는 것보다 몇 배나 저장공간을 차지하게 된다.
이를 개선하기 위해 CHAR(32)가 아닌 UUID를 Binary(16) 형태로 저장하게 되면, 크기를 절반으로 줄일 수 있다.
단, UUID를 Binary 형태로 저장하게 되면, 사람이 읽을 수 있도록 변환하는 과정이 필요하다.
16진수 문자열 -> 바이너리 형태로 변환된 UUID 조회 결과
바이너리 UUID -> 16진수 문자열로 변환(HEX)
변환된 UUID 하이픈(-)이 포함된 소문자(MariaDB에서 조회했던 UUID 형태로 변환) BIN_TO_UUID()
참조로 BIN_TO_UUID 함수와 반대로 문자열에서 바이너리로 변경하는 UUID_TO_BIN 함수는 MySQL 8.0부터 지원한다.
(참조) MariaDB에서 BIN_TO_UUID function 생성문
DELIMITER $$ CREATE FUNCTION BIN_TO_UUID(b BINARY(16)) RETURNS CHAR(36) BEGIN DECLARE hexStr CHAR(32); SET hexStr = HEX(b); RETURN LOWER(CONCAT( SUBSTR(hexStr, 1, 8), '-', SUBSTR(hexStr, 9, 4), '-', SUBSTR(hexStr, 13, 4), '-', SUBSTR(hexStr, 17, 4), '-', SUBSTR(hexStr, 21) )); END; $$ DELIMITER ; |
16진수 문자열 UUID를 바이너리로 변경 (UNHEX 또는 UUID_TO_BIN())
결론적으로, 바이너리를 HEX() 또는 BIN_TO_UUID()로 16진수 문자열로 변환 가능하며, 반대로는 UNHEX() UUID_TO_BIN()으로 변환 가능하다.
참조 사이트
https://velog.io/@wndbsgkr/MySQL%EC%97%90%EC%84%A0-UUID%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EC%A3%A0\
https://mysqlcode.com/mysql-uuid_to_bin-and-bin_to_uuid/
감사합니다.