在选择中仍具有匹配附加字符的唯一标识符


19

我们正在使用带有唯一标识符的SQL Server 2012,并且我们注意到在进行选择时在末尾添加了其他字符(而不是36个字符)时,它仍然会返回与UUID的匹配项。

例如:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 

返回带有uuid的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8

但是,如果您运行:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'

它还返回带有uuid的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8

选择SQL Server时,似乎会忽略除36个字符之外的所有字符。这是错误/功能还是可以配置的东西?

这不是一个大问题,因为我们在前端进行了长度验证,但对我来说似乎不是正确的行为。

Answers:


10

如果将值括在大括号中,则隐式转换也适用{...}

如果在查询中添加这些值,则如果原始值太长,则隐式转换将失败,因为最后一个值}在错误的位置结束。

select * 
from some_table 
where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'

如果您尝试转换

SELECT CONVERT(UNIQUEIDENTIFIER, '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');

你得到

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

10

选择SQL Server时,似乎会忽略除36个字符之外的所有字符。这是错误/功能还是可以配置的东西?

该行为记录在联机丛书条目中,uniqueidentifier类型为

BOL条目摘录

引用的示例是:

BOL示例

话虽这么说,我更希望避免隐式转换。一个uniqueidentifier文本可以直接在T-SQL中使用ODBC转义语法键入:

DECLARE @T AS TABLE
(
    uuid uniqueidentifier UNIQUE NOT NULL
);

INSERT @T (uuid)
SELECT {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

这是SQL Server在将字符串表示形式恒定折叠到typed时在内部执行计划中使用的相同语法uniqueidentifier

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8';

在uuid上进行索引查找

是否可以传入uniqueidentifiers和传出SQL Server取决于您使用的库,但是36个字符的字符串使我成为可用选项中最不希望的。如果必须执行转换,则使它们显式,并使用16字节的二进制值而不是字符串。


9

在隐式转换期间,SQL Server会简单地忽略其他字符(很好,将其无声地截断)。例如:

SELECT CONVERT(UNIQUEIDENTIFIER, '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS');

结果:

------------------------------------
7DA26ECB-D599-4469-91D4-F9136EC0B4E8

这与这种情况没有什么不同:

DECLARE @x VARCHAR(1) = 'xyz';
SELECT @x;

结果:

----
x  

您不能配置它,但是如果您希望变量无法转换,则可以尝试CHAR(36)先将变量填充到表中,由于截断操作,该表将失败:

DECLARE @x TABLE(y CHAR(36));
INSERT @x SELECT '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS';

结果:

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.