为了账号安全,请及时绑定邮箱和手机立即绑定

如何将GUID存储在MySQL表中?

如何将GUID存储在MySQL表中?

繁花如伊 2019-10-23 16:25:00
我使用varchar(36)还是有更好的方法呢?
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

当我问到为对象存储GUID的最佳方法时,我的DBA问我为什么当我可以用Integer以4字节进行相同的操作时为什么需要存储16字节。自从他向我提出挑战以来,我认为现在是提起挑战的好时机。话虽如此...

如果要最大程度地利用存储空间,可以将GUId存储为CHAR(16)二进制文件。


查看完整回答
反对 回复 2019-10-23
?
SMILET

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


查看完整回答
反对 回复 2019-10-23
  • 3 回答
  • 0 关注
  • 1295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信