数据库中使用GUID作为唯一编码的问题

weidegong 2004-03-26 08:40:47
在数据库中希望使用GUID作为主键。
GUID表现形式为一个36字节的字符串。
但GUID其实是一个二进制的占用16个字节的数据,所以我想数据字段的数据类型设置为16为字节是否可行?

为了查询或修改数据记录的方便,通常还是需要将主键字段设成字符串;用二进制数据类型作为主键或带来程序处理上的麻烦。

在Delphi中通过CreateClassID、CreateGUID得到GUID字符串,请问怎么得到这个字符串对应的二进制数据?将得到的二进制数据强行转换成字符串是否仍然能够保证它的唯一性?

下面是这么一个转换的例子:
GUID:B9E9A548-FFB5-45D1-8377-6F59F5A55621
对应的16进制数:0x48A5E9B9B5FFD14583776F59F5A55621
强制转换成的字符串:Hラ沟袳僿oY酯V!

最终数据的主键设置为16字节字符串,保存上面那个看上去是乱码的字符串,这个方案是否可行?以及如何从GUID的字符串得到这个乱七八糟的字符串?

请各位高手指点一二。
...全文
441 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weidegong 2004-03-27
  • 打赏
  • 举报
回复
okook(2004新春快乐):
因为可能会在多个DBMS中使用,而Oralce、Access等DBMS中是没有uniqueidentifier这个数据类型的;即使有作为binary类型的主键,在操作中也有诸多不便。

lijinghe1(副乡长):
自己写唯一代码也得写呀?这个唯一性也不如GUID吧?我准备把数据库会在多个表中做外键的字段全部设置成这个类型,实现数据表之间的关联。避免使用“级联更新、级联删除”。
okook 2004-03-27
  • 打赏
  • 举报
回复
多谢多谢!
我用下面的类型,轻松实现了这个转换。
。。。。

//-------------------------

你为什么不直接在数据库中设置呢?
lijinghe1 2004-03-27
  • 打赏
  • 举报
回复
这样效率低,自己写代码生成唯一编码也不难啊
weidegong 2004-03-27
  • 打赏
  • 举报
回复
为啥“别高兴得太早”?您倒是说呀;
叹气有啥用啊?
alphax 2004-03-26
  • 打赏
  • 举报
回复
别高兴得太早,哎
weidegong 2004-03-26
  • 打赏
  • 举报
回复
多谢多谢!
我用下面的类型,轻松实现了这个转换。

TUnichar = packed record
case Integer of
0: (Str: array[0..15] of char);
1: (guid:TGUID);
end;

使用这种转换过来的字符串,只要数据库中的16个字节就够了,爽!

其实SQLServer中也是这么保存的,不过除了要显示的时候需要处理一下之外;作为字符串类型保存的时候,在查询、更新等操作时方便多了。

再次感谢!
weidegong 2004-03-26
  • 打赏
  • 举报
回复
aiirii(ari-爱的眼睛):
TGUID = packed record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;

我正在把它试着拼出来;D1 4个字节;D2,D3 共两个字节;D48个字节,正好。
aiirii 2004-03-26
  • 打赏
  • 举报
回复
你用如上的结构,可用integer付值, 得到 char, or 相反!!!
aiirii 2004-03-26
  • 打赏
  • 举报
回复
type
TUnichar = packed record
case Integer of
0: (s: array[0..3] of char);
1: (x: Integer);
end;

function GetUnichar(Value: Integer): string;
var
c: TUnichar;
begin
c.x := Value;
Result := c.s;
end;

用如上的转化!!
只不过是个数组而已!!
TArrayUnichar = packed record
Guidchar: array[0..4] of TUnichar;
end;
weidegong 2004-03-26
  • 打赏
  • 举报
回复
楼上的:
SQLServer的uniqueidentifier类型保存的其实就是binary类型,长度16.
我上面不是说了,我不想用binary,想用16个字节的字符串来保存。所以要先把GUID转换成16字节字符串。

因为数据库不一定要用SQLServer,所以不用newid;我想在Delphi实现上面我提到的转换
postren 2004-03-26
  • 打赏
  • 举报
回复
是在SQLServer中的
postren 2004-03-26
  • 打赏
  • 举报
回复
可以用类型uniqueidentifier, 默认值NewID();自动会生成GUID的

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧