MariaDB (MySQL) UUID 優化之儲存方式 (storage)
最近專案的資料庫調整,由於有使用到 UUID,再煩惱怎麼要儲存減少資料量,讓之後的索引建置能夠更有效率,原先的儲存方式為 char(36) 想必是超級浪費空間的作法。
關於 UUID 以及調整函數
UUID,Universally unique identifier,是使用 128 bits 長度來描敘其 ID,因此最少的儲存空間需要 16 bytes,但在規範的標準型式中,會以 32 個十六進位數字,以連字號 (hyphens) 分成 (8-4-4-4-12) 共 36 個字元顯示。例如:
123e4567-e89b-12d3-a456-426655440000
但直接存 UUID 字串顯得沒有效率,應該轉換成二進位 (binary) 儲存,因此參考網路上的資料,建立以下兩個函數來使用。
由 UUID 字串到二進位,UUID_TO_BIN:
CREATE FUNCTION `UUID_TO_BIN` (`uuid` char(36) CHARACTER SET 'ascii')
RETURNS binary(16) DETERMINISTIC
RETURN unhex(replace(uuid,'-',''))
由 UUID 二進位到字串,UUID_FROM_BIN:
DELIMITER |
CREATE FUNCTION `UUID_FROM_BIN` (`uuid` binary(16))
RETURNS char(36) CHARACTER SET 'ascii' DETERMINISTIC
BEGIN
DECLARE hex CHAR(32);
SET hex = HEX(uuid);
RETURN LOWER(CONCAT(SUBSTR(hex, 1, 8), '-', SUBSTR(hex, 9, 4), '-', SUBSTR(hex, 13, 4), '-', SUBSTR(hex, 17, 4), '-', SUBSTR(hex, 21)));
END
|
DELIMITER ;
新增函數錯誤
但實務上在 AWS RDS 上,嘗試建立這兩個函數時,卻會跳出以下錯誤:
Error in query (1419): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
原來只是資料庫參數設定問題,按照這份指南,在 RDS Parameter Groups 中,調整 log_bin_trust_function_creators 為 1,並且重新套用該參數設定,便可以成功建立這兩個函數。
沒有留言: