Guid/UNIQUEIDENTIFIER(SQL Server)中的#是如何解释的
问题描述:
这是一个我只是偶然发现的行为。在SQL Server中的表有一个唯一标识符列,我跑起来像一个查询:Guid/UNIQUEIDENTIFIER(SQL Server)中的#是如何解释的
SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664#1'
的#1的GUID结束误了那里,因为我曾从被追加#一个网址复制粘贴它1,#2,#3等代表寻呼。
让我吃惊的是,查询运行得很好,我得到了相同的结果,我会通过运行得到:
SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664'
会有人知道怎么#和任何之后在这种情况下intepreted?
答
这一点将明确MSDN上:http://msdn.microsoft.com/en-us/library/ms187942.aspx
它不的意思是任何东西 - 当转换为Guid时,SQL服务器只读取字符串的前36个字符。
澄清
继约翰Gathogo的有关'{GUID}[gibberish]'
情况下(和验收后)评论,我想我可以稍微展开规则。
1)如果字符串'{'
开始,那么 MUST是'}'
(尝试甚至领先并在尾部的空格 - 它不会工作),否则转换失败。然后转换内部的36个字符。
2)否则,使用前36个字符。
所以你可以添加:)
,<<
和antidisestablishmentarianism
- 在1)中的第38个字符或2)中的第36个字符后,它没有区别。
答
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
这不是说你的解释,但这**选择*从Tbl在哪里GuidColumn = N'{2B375CD8-D210-463F-A2FD-EAFB0D643664}'**也适用。因此,当您添加{}之后,它会执行更严格的操作(超出您的FIRST 36 CHARACTERS解释),因为您不能在{}内输入其他乱码。但是,你可以在关闭后添加乱码} – 2012-03-28 15:23:05
@JohnGathogo这是一个公平的点将编辑到一个更合适的东西 – 2012-03-28 15:29:35