我有一个名为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
?并返回相同的结果?
答案 0 :(得分:3)
如documentation所述:
以下示例演示了当转换为的数据类型的值太长时截断数据。由于uniqueidentifier类型限制为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)
答案 1 :(得分:2)
919C3BF9-B081-458C-897D-C0B3FF56AF73
是16个字节,因此来自给定的91
9C
是第1个字节
3B
是第二个字节
F9
是第3个字节
56
是第4个字节
..
..
..
..
AF
是第14个字节
73
是第15个字节
919C3BF9-B081-458C-897D-C0B3FF56AF73xyz
是第16个字节
在xyz
之前完成GUID
的解析。
所以在第16个字节后输入字符,不予考虑。
但如果您在前面添加任何额外字符,则不会将其视为有效GUID
。
此外,当您使用{}
进行查询时,请使用SELECT * FROM Student
WHERE StudentId = '{919C3BF9-B081-458C-897D-C0B3FF56AF73}'
之间的代码。
def my_method
$redis.set('redis','so its working')
end