2009-10-02 38 views
7

Có ai biết về bất kỳ công việc nào xung quanh mà tôi có thể lưu số nguyên chưa ký (0 đến 4294967295) chỉ đơn giản bằng cách sử dụng 4 byte thay vì sử dụng 8 byte và bigint?sql server 4 byte unsigned int

Tôi biết chúng tôi có thể tạo kiểu dữ liệu do người dùng xác định và tạo ràng buộc cho chúng không cho phép giá trị âm nhưng vẫn không cho phép tôi nhập giá trị trên 2147483647. Tôi chỉ muốn sử dụng 4 byte nhưng có thể lưu giá trị số nguyên lớn hơn 2147483647 nhưng ít hơn 4294967295.

có thể trùng lặp: 4 byte unsigned int in SQL Server?

+0

kiểu dữ liệu khác nhau một chút công bằng từ thực hiện để thực hiện .. mà sql server bạn đang sử dụng MSSQL? mysql? – whatnick

+0

thẻ "sql-server" dành cho Mircosoft SQL Server. – RBarryYoung

+0

m bằng cách sử dụng máy chủ sql 2008 :-) thats lý do tại sao tôi đã gắn thẻ nó sql-server – Raj

Trả lời

3

không có kiểu unsigned sẵn cho bạn, vì vậy bạn có thể tạo một trang bằng UDT, hoặc lựa chọn các kiểu dữ liệu lớn hơn . Nếu bạn làm điều đó trong một UDT bạn sẽ vượt quá 4 byte một lần nữa.

Đòn tấn công cực đoan sẽ áp dụng giá trị tự động cho giá trị được lưu trữ của bạn sau khi bạn đọc, bằng cách thêm -2^31 nhưng đây là cách hacky thực sự để giải quyết và gây nhầm lẫn cho bất kỳ ai xem mã, v.v. đề cập đến tiềm năng cho những sai lầm/những thứ bị bỏ qua. Tôi sẽ không khuyên bạn nên hack ở tất cả.

0

Giải pháp này có thể hơi khó hiểu nhưng sẽ hoạt động cho mục đích của bạn. Lưu trữ các giá trị lớn hơn 2^31-1 vì các số nguyên gây tràn và xuất hiện dưới dạng số âm. Bạn vẫn có thể lưu trữ các giá trị của mình dưới dạng số nguyên và diễn giải lại chúng theo mã.

+1

Hành vi của tràn được xác định? hay nó khác nhau bằng cách thực hiện? – Pacerier

2

Sử dụng nhị phân (4). Quấn nó vào một UDT nếu bạn muốn.

+5

Điều này thực sự sử dụng 6 byte: 4 byte dữ liệu + 2 byte trên không cho loại dữ liệu nhị phân. –

+0

Chi phí là lý do tại sao tôi đã đi với một 'int' với một ràng buộc kiểm tra thay vì' nhị phân (2) 'cho một' uint16'. Bạn cũng có thể cần phải xem xét tính cuối cùng với định dạng lưu trữ 'nhị phân (x)'. –

+0

@JeffMeatballYang Không, 'varbinary' có chi phí 2 byte,' binary' không có. Xem tại đây: http://www.smattie.com/2013/01/14/sql-server-data-types/ (cũng xin lỗi, nhưng bằng cách nào đó tôi đã bỏ lỡ bình luận của bạn cách đây ba năm) – RBarryYoung

0

Như đã đề cập bởi RBarry, hãy thử sử dụng này:

declare @bi binary(4) = cast(2147483648 as bigint) 

declare @i int = cast(@bi as binary(4)) 

select @i 

declare @bi2 bigint = cast(cast(@i as binary(4)) as bigint) 

select @bi2 
Các vấn đề liên quan