我有一个名为Student
的表,包含列StudentId
作为GUID
,因此我使用Uniqueidentifier
数据类型。
如果我想获得特定的记录,我通过下面的查询得到结果:
SELECT * FROM Student WHERE StudentId = '919C3BF9-B081-458C-897D-C0B3FF56AF73'
返回预期的结果。但是,如果我错误地在最后也添加了任何额外的字符,它会返回相同的结果。就像下面的查询:
SELECT * FROM Student WHERE StudentId = '919C3BF9-B081-458C-897D-C0B3FF56AF73xyz'
如果我在GUID
的末尾传递额外的字符,为什么它不被认为是无效的GUID
?并返回相同的结果?
如文档所述:
下面的示例演示了当值太长而无法转换为的数据类型时如何截断数据。由于唯一标识符类型限制为36个字符,因此超过该长度的字符将被截断。
DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;
这是结果集。
String TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0
(1 row(s) affected)
GUID
是16字节,所以从给定的919C3BF9-B081-458C-897D-C0B3FF56AF73
91
是第一个字节9C
是第二个字节3B
是第3个字节F9
是第4字节
. .
. .
. .
. . 56
是第14字节AF
是第15个字节73
是第16字节
919C3BF9-B081-458C-897D-C0B3FF56AF73xyz
在xyz
之前完成解析。
所以字符在第16个字节之后输入,将不被考虑。
但是如果你在前面添加了任何额外的字符,它将不认为是有效的GUID
。
此外,当您使用GUID
查询时,请使用{}
之间的代码。
SELECT * FROM Student
WHERE StudentId = '{919C3BF9-B081-458C-897D-C0B3FF56AF73}'