我在SQL Server中使用标准的ASP.NET Membership表结构,并且正在管理工作室中进行一些手动查询并运行此查询
SELECT *
FROM [aspnet_Users]
WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49'
注意最后的& cID = 49 - 我从查询字符串复制了这个并忘记删除该部分。
然而,令我惊讶的是它正确地返回了数据(有一个ID为2ac5dd56-2630-406a-9fb8-d4445bc781da的用户) - 任何想法为什么会这样做?在我看来它不应该匹配或者更可能抛出错误,因为它不能转换为Guid?
答案 0 :(得分:3)
uniqueidentifier
类型被认为是用于从字符表达式转换的字符类型,因此受到转换为字符类型的截断规则的约束。也就是说,当字符表达式转换为不同大小的字符数据类型时,对于新数据类型而言太长的值将被截断。
由于uniqueidentifier类型限制为36个字符,超出该长度的字符将被截断。
请注意,上述内容来自MSDN
答案 1 :(得分: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)
都给出相同的结果,没有错误。
This is documented behaviour,所以我们无法抱怨:
以下示例演示了截断数据时的情况 转换为的数据类型的值太长。因为 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)