sqlite uniqueidentifier 的问题

这篇博客探讨了 SQLite 如何存储 GUID,包括二进制和文本两种方式,以及它们在存储空间和顺序上的差异。文章指出,存储顺序可能因大端与小端问题而异,并提供了正确查询已按字节或文本存储 GUID 的 SQL 语句。还提到了通过设置 'binaryGUID=False' 连接参数来改变 GUID 的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要知道guid (或 uuid,以下都以guid代替) 在sqlite如何存储。

首先明确,guid 一种由算法生成的二进制长度为128位的数字标识符,也就是一组16字节数字

sqlite存储16字节有两种方式,

sqlite存储格式占用sqlite数据库的字节数备注
第一种二进制(blob)16与guid 占用的空间一样,但顺序不一定一样
第二种文本(text)36(典型值)对于guid中每个有效字节,sqlite用2个字节去存储,额外加上4个连接号

比如,一个guid用字符串表示为

{29D63F60-0286-4700-B85E-0F1C383429EF}

用二进制可表示为(下文称“guid二进制表示法”)

0x29 0xD6 0x3F 0x60  0x02 0x86  0x47 0x00  0xB8 0x5E  0x0F 0x1C 0x38 0x34 0x29 0xEF

用文本可表示为(下文称“guid文本表示法”)

'2' '9' 'D' '6' '3' 'F' '6' '0' '-' '0' '2' '8' '6' '-' '4' '7' '0' '0' '-' 'B' '8' '5' 'E' '-' '0' 'F' '1' 'C' '3' '8' '3' '4' '2' '9' 'E' 'F

那么,sqlite存储 guid二进制表示法 时,实际存储的是

60 3F D6 29 86 02 00 47 B8 5E 0F 1C 38 34 29 EF

(有人说造成这个问题的根本原因在于 大端与小端,有待考究) 

sqlite存储guid文本表示法时,实际存储的是

“29d63f60-0286-4700-b85e-0f1c383429ef”

PS:默认情况下sqlite按照字节存储guid。可以在连接sqlite数据库时增加“binaryGUID=False”,使sqlite按照文本存储guid。

比如“Data Source=c:\mydb.db;Version=3;BinaryGUID=False;”。(参考 Store GUID as text - SQLite.NET - ConnectionStrings.com

 所以,对于已经按照字节存储的guid,

正确写法是这样:(即按照sqlite实际存储的二进制的顺序,而 不是guid二进制表示法 的顺序)

select * from DBShapeTemp where id = x'603FD62986020047B85E0F1C383429EF'

对于已经按照文本存储的guid,(即按照sqlite实际存储的字符串顺序,也就是guid文本表示法的顺序)

select * from DBShapeTemp where id = '29d63f60-0286-4700-b85e-0f1c383429ef'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值