如何在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'
有人知道在这种情况下,#和之后的任何东西是如何被隐藏的吗?
这在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