Guid有额外的角色问题

时间:2015-08-07 10:58:54

标签: sql sql-server guid uniqueidentifier

我有一个名为Student的表,包含StudentIdGUID,所以我使用了Uniqueidentifier数据类型。

如果我想获得特定记录,我会通过以下查询得到结果:

SELECT * FROM Student WHERE StudentId = '919C3BF9-B081-458C-897D-C0B3FF56AF73'

返回预期结果。但是如果我错误地在最后添加任何额外的字符,它会返回相同的结果。如下面的查询:

SELECT * FROM Student WHERE StudentId = '919C3BF9-B081-458C-897D-C0B3FF56AF73xyz'

如果我在GUID末尾传递额外字符,为什么不将其视为无效GUID?并返回相同的结果?

2 个答案:

答案 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