在sqlite中使用guid选择guid作为二进制文件存储在sqlite db中的位置

时间:2011-10-19 01:24:44

标签: sql sqlite

我在SQLite数据库中有一个表Employee。其主键是GUID类型的“ID”。我尝试使用以下查询找到id = guid 'a8828ddf-ef22-4d36-935a-1c66ae86ebb3'的记录但没有运气:

SELECT * FROM Employee
WHERE Employee.Id = 'a8828ddf-ef22-4d36-935a-1c66ae86ebb3'

任何人都可以告诉我该如何编写查询?

谢谢,

3 个答案:

答案 0 :(得分:11)

这是一个老问题,但是如果选择的答案是正确的,那么搜索会产生搜索,但它可能并不适合所有人。例如,当使用.NET绑定到SQLite时。

原因是当GUID格式为a8828ddf-ef22-4d36-935a-1c66ae86ebb3时,您不能只删除短划线并将其放到X'...'。 GUID有几个部分,数据库以不同的方式存储二进制文件。

当GUID为a8828ddf-ef22-4d36-935a-1c66ae86ebb3时,它将以X'df8d82a822ef364d5a93b3eb86ae661c'的小端存储。请注意,所有部分都在字符串中反转。

当然,如果通过将短划线删除为X'a8828ddfef224d36935a1c66ae86ebb3'来直接插入数据,您也可以使用它来检索它,但如果让.NET处理转换,GUID将存储为小端字节表示。

(这都假设小端架构,没有在大端测试)

答案 1 :(得分:8)

GUID可能存储为二进制blob;尝试:

SELECT * FROM Employee
WHERE Employee.Id = X'a8828ddfef224d36935a1c66ae86ebb3';

答案 2 :(得分:1)

萨米人的回答为我指明了正确的方向。 .NET以不同的方式输出Guid,因此,如果使用.NET进行存储,而不是使用rawsql来获取数据,则rawsql中的guid需要以相同的方式进行转换。 但是,就我而言,这不是小端符号。 使用以下代码,您可以找到正确的字符串:

var byteArray = new Guid("a8828ddf-ef22-4d36-935a-1c66ae86ebb3").ToByteArray();
string hex = BitConverter.ToString(byteArray).Replace("-", string.Empty);

在我的计算机上,这返回:“ DF8D82A822EF364D935A1C66AE86EBB3” 因此,我的原始sql必须是

"select * from [tablename] where ID = X'DF8D82A822EF364D935A1C66AE86EBB3'"

为什么我需要这个;因为我使用的是内存中的SQLite数据库,该数据库是使用EF Core填充的,因此我想在其中测试rawSql命令。 这对于处于相同情况的其他人可能很方便。但是,请记住,在SQLite中工作的rawSql可能无法在另一个数据库上工作(反之亦然)。