6

我在 SQL Server 中使用标准的 ASP.NET Membership 表结构,并在 Management Studio 中进行了一些手动查询并运行了此查询

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

请注意末尾的 &cID=49 - 我从查询字符串中复制了它并忘记删除该部分。

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

4

2 回答 2

3

出于从字符表达式转换的目的,该uniqueidentifier类型被视为字符类型,因此受用于转换为字符类型的截断规则的约束。也就是说,当字符表达式转换为不同大小的字符数据类型时,对于新数据类型来说太长的值将被截断

因为 uniqueidentifier 类型限制为 36 个字符,所以超过该长度的字符将被截断。

注意以上引用自MSDN

于 2012-05-02T08:41:26.327 回答
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)

都给出相同的结果,没有错误。

这是记录在案的行为,所以我们不能真正抱怨:

以下示例演示了当值对于要转换的数据类型而言太长时截断数据。因为 uniqueidentifier 类型限制为 36 个字符,所以超过该长度的字符将被截断。

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

这是结果集。

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

(1 row(s) affected)
于 2012-05-02T08:39:32.597 回答