带有额外字符问题的指南

Guid with extra characters issue

我有一个名为 Student 的 table,包含一个列 StudentId 作为 GUID,所以我为此使用了 Uniqueidentifier 数据类型。

如果我想得到特定的记录,我通过下面的查询得到结果:

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

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

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

如果我在GUID的末尾传递了额外的字符,为什么它不被认为是无效的GUID?和 return 相同的结果?

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}'

documentation 所述:

The following example demonstrates the truncation of data when the value is too long for the data type being converted to. Because the uniqueidentifier type is limited to 36 characters, the characters that exceed that length are truncated.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

Here is the result set.

String                                       TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong    0E984725-C51C-4BF4-9960-E1C80E27ABA0

(1 row(s) affected)