3 回答

TA貢獻1804條經驗 獲得超8個贊
當我問到為對象存儲GUID的最佳方法時,我的DBA問我為什么當我可以用Integer以4字節進行相同的操作時為什么需要存儲16字節。自從他向我提出挑戰以來,我認為現在是提起挑戰的好時機。話雖如此...
如果要最大程度地利用存儲空間,可以將GUId存儲為CHAR(16)二進制文件。

TA貢獻1796條經驗 獲得超4個贊
通過ThaBadDawg的答案,使用這些方便的函數(由于我的聰明的同事)使36個長度的字符串返回到16個字節數組。
DELIMITER $$
CREATE FUNCTION `GuidToBinary`(
$Data VARCHAR(36)
) RETURNS binary(16)
DETERMINISTIC
NO SQL
BEGIN
DECLARE $Result BINARY(16) DEFAULT NULL;
IF $Data IS NOT NULL THEN
SET $Data = REPLACE($Data,'-','');
SET $Result =
CONCAT( UNHEX(SUBSTRING($Data,7,2)), UNHEX(SUBSTRING($Data,5,2)),
UNHEX(SUBSTRING($Data,3,2)), UNHEX(SUBSTRING($Data,1,2)),
UNHEX(SUBSTRING($Data,11,2)),UNHEX(SUBSTRING($Data,9,2)),
UNHEX(SUBSTRING($Data,15,2)),UNHEX(SUBSTRING($Data,13,2)),
UNHEX(SUBSTRING($Data,17,16)));
END IF;
RETURN $Result;
END
$$
CREATE FUNCTION `ToGuid`(
$Data BINARY(16)
) RETURNS char(36) CHARSET utf8
DETERMINISTIC
NO SQL
BEGIN
DECLARE $Result CHAR(36) DEFAULT NULL;
IF $Data IS NOT NULL THEN
SET $Result =
CONCAT(
HEX(SUBSTRING($Data,4,1)), HEX(SUBSTRING($Data,3,1)),
HEX(SUBSTRING($Data,2,1)), HEX(SUBSTRING($Data,1,1)), '-',
HEX(SUBSTRING($Data,6,1)), HEX(SUBSTRING($Data,5,1)), '-',
HEX(SUBSTRING($Data,8,1)), HEX(SUBSTRING($Data,7,1)), '-',
HEX(SUBSTRING($Data,9,2)), '-', HEX(SUBSTRING($Data,11,6)));
END IF;
RETURN $Result;
END
$$
CHAR(16)實際上是一種BINARY(16),選擇您喜歡的口味
為了更好地遵循代碼,請使用下面給出了數字順序GUID的示例。(非法字符用于說明目的-每個位置都有一個唯一字符。)這些函數將轉換字節順序,以實現高級索引聚類的位順序。示例下面顯示了重新排序的GUID。
12345678-9ABC-DEFG-HIJK-LMNOPQRSTUVW
78563412-BC9A-FGDE-HIJK-LMNOPQRSTUVW
刪除的破折號:
123456789ABCDEFGHIJKLMNOPQRSTUVW
78563412BC9AFGDEHIJKLMNOPQRSTUVW
添加回答
舉報