如何在Guid/UNIQUEIDENTIFIER(SQL Server)中集成#

本文关键字:Server 集成 SQL Guid UNIQUEIDENTIFIER | 更新日期: 2023-09-27 18:29:21

这是我偶然发现的一个行为。SQL Server中的表有一个UNIQUEIDENTIFIER列,我运行了一个查询,如:

SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664#1'

Guid末尾的#1错误地到达了那里,因为我从一个附加了#1、#2、#3等表示分页的url中复制粘贴了它。

让我惊讶的是,查询运行得很好,我得到了与运行相同的结果

SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664'

有人知道在这种情况下,#和之后的任何东西是如何被隐藏的吗?

如何在Guid/UNIQUEIDENTIFIER(SQL Server)中集成#

这在MSDN上得到了明确的处理:http://msdn.microsoft.com/en-us/library/ms187942.aspx

这并不意味着任何东西-SQL server在转换为Guid时只读取字符串的前36个字符。

澄清

根据John Gathogo对'{GUID}[gibberish]'案例的评论(以及接受之后),我认为我可以稍微扩展一下规则。

1) 如果该字符串以'{'开头,则第38个必须'}'(请尝试在其中使用前导空格和尾随空格,否则转换失败)。然后转换其中的36个字符。

2) 否则,将使用前36个字符。

因此,您可以在1)中的第38个字符或2)中的36个字符之后添加:)<<antidisestablishmentarianism,这没有什么区别。

GUID是固定宽度的,因此在类型转换过程中会剥离多余的字符;

declare @g uniqueidentifier = '2B375CD8-D210-463F-A2FD-EAFB0D643664#1'
select @g
>> 2B375CD8-D210-463F-A2FD-EAFB0D643664

我怀疑查询引擎发现它是一个唯一标识符,并且在内部只截断36个字符,所以之后的任何内容都会被忽略。这也很好,所以它与#符号完全无关:

SELECT CONVERT(UNIQUEIDENTIFIER, 'F9B8E808-E589-499B-8E57-22B7CBB2D63E ...
       and here is some extra garbage for fun');

结果:

------------------------------------
F9B8E808-E589-499B-8E57-22B7CBB2D63E