2012-05-02 33 views
6

Tôi đang sử dụng cấu trúc bảng ASP.NET Membership tiêu chuẩn trong SQL Server và đang làm một chút bằng tay truy vấn trong studio quản lý và chạy truy vấn nàytruy vấn SQL không làm việc như mong đợi

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

Thông báo các & CID = 49 ở cuối - tôi đã sao chép từ chuỗi truy vấn và quên xóa phần đó.

Tuy nhiên, với sự ngạc nhiên của tôi, nó trả về dữ liệu chính xác (có người dùng có ID 2ac5dd56-2630-406a-9fb8-d4445bc781da) - bất kỳ ý tưởng nào tại sao tính năng này hoạt động? Để tâm trí của tôi nó không nên phù hợp hoặc có thể nhiều khả năng ném một lỗi vì nó không nên có thể chuyển đổi sang một Guid?

+0

giá trị là những gì excatly tại DB? –

Trả lời

3

Loại uniqueidentifier được coi là một loại nhân vật với mục đích chuyển đổi từ một biểu hiện nhân vật, và do đó là tùy thuộc vào các quy tắc cắt ngắn để chuyển đổi cho một loại nhân vật. Tức là, khi biểu thức ký tự được chuyển đổi thành kiểu dữ liệu ký tự có kích thước khác, thì giá trị quá dài cho loại dữ liệu mới bị cắt bớt.

Do loại bộ định dạng duy nhất được giới hạn trong 36 ký tự, các ký tự vượt quá độ dài đó sẽ bị cắt bớt.

Lưu ý rằng trên được trích dẫn từ MSDN

+0

+1. nhưng lạ của nó .... tôi đã nói với anh ta để tìm kiếm A123 và không A123blabla ..... –

+0

Cảm ơn, điều đó có ý nghĩa hơn bây giờ nhưng tôi đồng ý nó là lạ - nếu tôi vượt qua trong một giá trị đó là ít hơn 36 ký tự thì tôi nhận được một lỗi chuyển đổi vì vậy kỳ vọng của tôi sẽ là nếu tôi vượt qua trong nhiều hơn thì nó cũng sẽ thất bại! –

2

Các phân tích cú pháp là (đáng kể) khoan dung khi chuyển đổi xâu để guid literals, rõ ràng:

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) 

tất cả các cung cấp cho các kết quả tương tự, không có lỗi.

This is documented behaviour, vì vậy chúng tôi có thể không thực sự phàn nàn:

Ví dụ sau đây cho thấy sự cắt cụt của dữ liệu khi giá trị là quá dài đối với các kiểu dữ liệu được chuyển đổi sang. Vì loại số độc đáo được giới hạn trong 36 ký tự, các ký tự mà vượt quá độ dài đó sẽ bị cắt bớt.

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

Đây là tập hợp kết quả.

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

(1 row(s) affected) 
+0

Cảm ơn, tôi hiểu bây giờ - có vẻ như là một người kỳ quặc! –

Các vấn đề liên quan