2009-10-02 12 views
7

Czy ktoś wie o jakiejkolwiek pracy wokół której mogę zapisać liczby całkowite bez znaku (od 0 do 4294967295) po prostu używając 4 bajty zamiast 8 bajtów i bigint?Serwer 4-bajtowy bez znaku int

Wiem, że możemy tworzyć zdefiniowane przez użytkownika typy danych i utworzyć na nich ograniczenie, aby nie zezwalać na wartości ujemne, ale to nadal nie pozwala mi wprowadzić wartości powyżej 2147483647. Chcę używać tylko 4 bajty, ale można zapisać wartości całkowite większa niż 2147483647 ale mniej niż 4294967295.

Możliwy duplikat: 4 byte unsigned int in SQL Server?

+0

typy danych różnią się w porządku trochę z wdrożenia do realizacji .. która serwera SQL używasz MSSQL? mysql? – whatnick

+0

Znacznik "sql-server" jest przeznaczony dla serwera Mircosoft SQL Server. – RBarryYoung

+0

m przy użyciu serwera sql 2008 :-) dlatego to oznaczałem go jako serwer sql – Raj

Odpowiedz

3

nie ma niepodpisany typu dostępne, więc można utworzyć za pomocą UDT, lub zdecydować się na większy typu danych . Jeśli zrobisz to w UDT, znowu przekroczysz 4 bajty.

Ostatecznym hakiem byłoby zastosowanie przesunięcia automatycznie do zapisanej wartości po przeczytaniu, dodając -2^31, ale jest to naprawdę zjadliwy sposób na obejście tego problemu i dezorientacja dla każdego, kto przegląda kod itp., Nie wspomnieć o potencjalnych błędach/rzeczach, które zostały pominięte. W ogóle bym tego nie polecał.

0

To rozwiązanie może być nieco mylące, ale zadziała w Twoim przypadku. Przechowywanie wartości większych niż 2^31-1 jako liczb całkowitych powoduje przepełnienie i pojawia się jako liczba ujemna. Możesz nadal przechowywać swoje wartości jako liczby całkowite i ponownie zinterpretować je w kodzie.

+1

Czy zdefiniowano zachowanie przepełnienia? lub czy różni się w zależności od implementacji? – Pacerier

2

Użyj pliku binarnego (4). Owiń go w UDT, jeśli chcesz.

+5

To faktycznie używa 6 bajtów: 4 bajty danych + 2 bajty narzutu dla binarnego typu danych. –

+0

Napowietrzne jest to, dlaczego użyłem 'int' z ograniczeniem wyboru zamiast' binary (2) 'dla' uint16'. Konieczne może być również uwzględnienie endianizmu w formacie zapisu binarnego (x). –

+0

@JeffMeatballYang Nie, 'varbinary' ma 2-bajtowe obciążenie,' binary' ma brak. Zobacz tutaj: http://www.smattie.com/2013/01/14/sql-server-data-types/ (również, przepraszam, ale jakoś tęskniłem za twoim komentarzem trzy lata temu) – RBarryYoung

0

Jak wspomniano przez RBarry, spróbuj tego:

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 
Powiązane problemy