2012-05-02 93 views
6

我使用SQL Server的标准ASP.NET成员表结构,并做了一些在管理工作室手工查询和运行此查询SQL查询不按预期工作

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

通知的& CID = 49最后 - 我从querystring中复制这个,忘记删除那部分。

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

+0

的价值是什么excatly在DB报价? –

回答

3

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

由于唯一标识符类型限制为36个字符,超过该长度的字符将被截断。

注意,上面是从MSDN

+0

+1。但它的奇怪....我告诉他搜索A123而不是A123blabla ..... –

+0

谢谢,现在更有意义,但我同意这很奇怪 - 如果我通过一个小于36个字符的值,然后我得到一个转换错误,所以我的期望是,如果我通过了,那么它也会失败! –

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) 
+0

谢谢,我现在明白了 - 虽然看起来很奇怪! –