【问题标题】:Guid with extra characters issue带有额外字符问题的指南
【发布时间】:2015-08-07 10:58:54
【问题描述】:

我有一个名为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?并返回相同的结果?

【问题讨论】:

  • 在sql中比较用户字符串

标签: sql sql-server guid uniqueidentifier


【解决方案1】:

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)

【讨论】:

  • msdn 甚至有一个类似的示例详细说明了相同的内容
  • 也许添加这个例子来演示:SELECT CONVERT(UNIQUEIDENTIFIER, '919C3BF9-B081-458C-897D-C0B3FF56AF73-This-is-extra') - 产生:919C3BF9-B081-458C-897D-C0B3FF56AF73
【解决方案2】:

GUID 是 16 个字节,所以从给定的919C3BF9-B081-458C-897D-C0B3FF56AF73

91 是第一个字节
9C 是第二个字节
3B 是第三个字节
F9 是第四个字节
..
..
..
..
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}'

【讨论】:

  • 为了补充这个答案,uniqueidentifier 数据类型比 varchar 具有更高的数据类型优先级,因此 varchar 文字被隐式转换为 uniqueidentifier。没有花括号包围,解析显然更加宽松,截断文字中的无关字符。
  • 花括号内的额外字符会导致错误,但{} 之外的额外字符会被忽略和截断。 SELECT CONVERT(uniqueidentifier ,'{919C3BF9-B081-458C-897D-C0B3FF56AF73}EXTRA') SELECT CONVERT(uniqueidentifier ,'{919C3BF9-B081-458C-897D-C0B3FF56AF73EXTRA}')
  • 感谢您在与guid 一起使用时介绍{}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多