SQL查询未按预期工作

6

我正在使用SQL Server中的标准ASP.NET成员表结构,并在管理工具中手动查询,运行了以下查询:

SELECT *
FROM [aspnet_Users]
WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49'

注意末尾的&cID=49 - 这是我从查询字符串中复制过来的,忘了删除。

然而,令我惊讶的是,它正确地返回了数据(存在一个ID为2ac5dd56-2630-406a-9fb8-d4445bc781da的用户)——有任何想法为什么这会有效?在我看来,它不应该匹配或者更可能抛出一个错误,因为它不能转换为Guid?


在数据库中确切地是什么值? - Royi Namir
2个回答

3
uniqueidentifier类型在转换为字符表达式时被认为是字符类型,因此受到转换为字符类型的截断规则的限制。也就是说,当将字符表达式转换为不同大小的字符数据类型时,超过新数据类型长度的值会被截断
由于uniqueidentifier类型仅限36个字符,超过该长度的字符将被截断。 请注意以上内容引用自MSDN

谢谢,现在更有意义了,但我同意这很奇怪 - 如果我传递的值少于36个字符,则会出现转换错误,因此我的期望是如果我传递的字符数更多,则也会失败! - Kevin Main

2

当将字符串文字转换为GUID文字时,解析器(非常)宽容,显然:

SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52a' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52-!' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52~#5' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52$3%] ' AS uniqueidentifier)

所有都会得到相同的结果,没有错误。

这是文档中记录的行为,所以我们不能抱怨:

The following example demonstrates the truncation of data when the value is too long for the data type being converted to. Because the uniqueidentifier type is limited to 36 characters, the characters that exceed that length are truncated.

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

Here is the result set.

String                                       TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong    0E984725-C51C-4BF4-9960-E1C80E27ABA0

(1 row(s) affected)

谢谢,我现在明白了 - 不过似乎有点奇怪! - Kevin Main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接