2012-02-03 27 views
31

Ai đó gần đây đã hỏi tôi câu hỏi này và tôi nghĩ tôi sẽ đăng nó lên Stack Overflow để nhận một số đầu vào.Tại sao truyền/chuyển đổi từ int trả về dấu hoa thị

Bây giờ rõ ràng cả hai trường hợp sau đây đều được cho là không thành công.

# 1:

DECLARE @x BIGINT 
SET @x = 100 
SELECT CAST(@x AS VARCHAR(2)) 

lỗi hiển nhiên:

Msg 8115, Level 16, State 2, Line 3
Arithmetic overflow error converting expression to data type varchar.

# 2:

DECLARE @x INT 
SET @x = 100 
SELECT CAST(@x AS VARCHAR(2)) 

Không rõ ràng, nó trả về một * (Một mong chờ điều này là một số học tràn cũng?)


Bây giờ câu hỏi thực sự của tôi là, tại sao ??? Đây có phải chỉ đơn thuần là do thiết kế hoặc có lịch sử hoặc một cái gì đó nham hiểm đằng sau điều này?

Tôi đã xem một vài trang web và không thể nhận được câu trả lời thỏa đáng.

ví dụ: http://beyondrelational.com/quiz/sqlserver/tsql/2011/questions/Why-does-CAST-function-return-an-asterik--star.aspx

http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx

Xin lưu ý tôi biết/hiểu rằng khi một số nguyên là quá lớn để được chuyển đổi sang một chuỗi có kích thước cụ thể mà nó sẽ được "chuyển đổi" để dấu hoa thị, đây là câu trả lời rõ ràng và Tôi ước gì tôi có thể hạ thấp mọi người mà vẫn tiếp tục đưa ra câu trả lời này. Tôi muốn biết tại sao dấu hoa thị được sử dụng và không phải là ngoại lệ được ném, ví dụ: lý do lịch sử vv ??

+5

tra cứu mã ASCII thập phân của dấu hoa thị để giải quyết "bí ẩn". – dasblinkenlight

+0

LOL, 42? Câu trả lời cho cuộc sống vũ trụ và mọi thứ khác ?? hehehe – Helix

+6

@dasblinkenlight - Điều đó giải thích tại sao 'select *' trả về ** mọi thứ ** :). –

Trả lời

27

Đối thậm chí vui vẻ hơn, hãy thử điều này:

DECLARE @i INT 
SET @i = 100 
SELECT CAST(@i AS VARCHAR(2)) -- result: '*' 
go 

DECLARE @i INT 
SET @i = 100 
SELECT CAST(@i AS NVARCHAR(2)) -- result: Arithmetic overflow error 

:)


Câu trả lời cho câu hỏi của bạn là: "những lý do lịch sử"

Các kiểu dữ liệu INT và VARCHAR lớn hơn BIGINT và NVARCHAR. Phần lớn cũ hơn. Trên thực tế, chúng có các thông số kỹ thuật số gốc của gốc. Cũng cũ hơn là phương pháp loại trừ ngoại lệ thay thế đầu ra bằng dấu sao.

Sau đó, các thành viên SQL quyết định rằng việc ném một lỗi tốt hơn/nhất quán hơn, vv thay thế các chuỗi đầu ra không có thật (và thường gây nhầm lẫn). Tuy nhiên vì sự nhất quán, họ vẫn giữ lại hành vi trước đó cho các kết hợp dữ liệu có sẵn từ trước (để không phá vỡ mã hiện có).

Vì vậy, (nhiều) sau đó khi các kiểu dữ liệu BIGINT và NVARCHAR được thêm vào, chúng có hành vi mới (er) bởi vì chúng không được đề cập đến ở trên.

+1

Tuyệt vời, nghi ngờ một cái gì đó như thế này nhưng chỉ muốn một số xác nhận thực sự, nhờ – Helix

+0

Tôi muốn có một liên kết đến bảng chuyển đổi của MS SQL Server và tham khảo phiên bản. – Markus

+1

Đây là một câu trả lời tuyệt vời. Chúng tôi đã có một vấn đề tương tự ở đây, đúc 6,7, và 8 chữ số INT đến CHAR (6), kết quả là một dấu hoa thị cho những người 7 hoặc 8. Chúng tôi đã mong đợi để có được một lỗi và có quá trình của chúng tôi không nhập dữ liệu này. Chúng tôi đã nhận được lỗi nhưng dữ liệu vẫn được nhập, chỉ thay thế phần này bằng dấu sao: ** ErrorMessage: Chuỗi hoặc dữ liệu nhị phân sẽ bị cắt bớt. ErrorSeverity: 16 ErrorState: 14 ** – Brien

0

Bạn có thể đọc trên trang CAST and CONVERT trên phần "Cắt bớt và làm tròn kết quả". Int, smallint và tinyint sẽ trả về * khi độ dài kết quả quá ngắn để hiển thị khi được chuyển thành char hoặc varchar.Chuyển đổi dạng số sang chuỗi khác sẽ trả về lỗi.

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