热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

是否可以将SqliteBlob列转换为十六进制字符串(GUID)?

如何解决《是否可以将SqliteBlob列转换为十六进制字符串(GUID)?》经验,为你挑选了1个好方法。

我有一个SQLite带有列的表,其中存储GUID一个字节数组

我试图从我的SQL查询中获取Guid字符串。到目前为止,我已经尝试过:

Select BlobGuidColumn from [MyTable]

但这返回一blob

是否可以Hex从SQL查询返回字符串?



1> Mahmoud Al-Q..:

可接受的答案存在一些问题,但是最重要的是,它并不总是产生正确的结果。如果目标只是将128位从二进制映射到类似GUID(8-4-4-4-12)的表示形式,那就可以了。但是,如果您实际上希望某项计算结果与同一个GUID相同,则不会这样做,因为未考虑基础数据的字节顺序。

以以下指导为例:

BC7CAE8C-E4D7-49CA-86E4-5FD540106CC0

表示为字节数组,您不一定会得到

BC-7C-AE-8C-E4-D7-49-CA-86-E4-5F-D5-40-10-6C-C0

作为答案,因为GUID / UUID的内部表示形式取决于字节顺序,具体取决于所讨论的UUID的变体。变体1 UUID严格是网络字节顺序(小尾数),而变体2 UUID在各个方面都相同,除了一半的分组以大字节序字节顺序存储在内存(或数据库的磁盘)中,而另一半则以网络字节顺序排列。

我写了一篇长篇文章,探讨了UUID / GUID的历史以及两个变体之间的区别,并提供了有关将UUID从二进制转换为文本的说明:将二进制/ blob guid列转换为文本在SQL中:比您想象的要难得多。

根据所讨论的变体,您可以像当前接受的答案一样直接使用SQL HEX()函数:

SELECT substr(hex(guid), 1, 8)
|| '-' || substr(hex(guid), 9, 4)
|| '-' || substr(hex(guid), 13, 4)
|| '-' || substr(hex(guid), 17, 4)
|| '-' || substr(hex(guid), 21, 12)
FROM [MyTable]

或者,如果源数据来自Microsoft世界(例如COM / WIN32 / .NET应用程序),则需要使用这种复杂得多的方法,该方法将每个分组的字节顺序考虑在内:

SELECT
substr(hguid, 7, 2) || substr(hguid, 5, 2) || substr(hguid, 3, 2) || substr(hguid, 1, 2) || '-'
|| substr(hguid, 11, 2) || substr(hguid, 9, 2) || '-'
|| substr(hguid, 15, 2) || substr(hguid, 13, 2) || '-'
|| substr(hguid, 17, 4) || '-'
|| substr(hguid, 21, 12)

AS guid

FROM (SELECT hex(guid) AS hguid FROM messages)

(此处guid,在最后一行仅将列转换为十六进制一次,以避免为每个字节重复这样做的开销。)

实际上,我不能在透明与否(如OP的特殊情况下)的Microsoft SQL Server存储在磁盘上的网络字节顺序或(部分)大端的GUID,虽然我倾向于认为这是因为它是后者在涉及到Microsoft技术的其他地方,情况普遍存在(这不是通用规则,但总的来说,“ guid”表示Little Endian,而“ uuid”则表示Big -有关更多信息,请参见文章)。

提示:如果结果以零开头,则说明您做错了。给定UUIDv1 / UUIDv2(时间戳)中第一组的来源,许多分辨率有限的来源在第一组十六进制数字的末尾都为零。但是,如果转换不正确,该组将以开头结尾:一个确定标志,表明您需要在特定情况下使用替代答案。


推荐阅读
author-avatar
书友69132746
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有