SQL Server 2008 - Ganzzahlige Datentypen ohne Vorzeichen

8

Ich benutze SQL SERVER 2008, ich habe eine Anzahl von INT, SMALLINT Feldern in meinen verschiedenen Tabellen, und ich weiß, dass sie alle 0 oder größer als 0 sind, d. h. ich kann sie Unsigned nehmen.

Gibt es eine einfache Möglichkeit, unsignierte Datentypen zu erstellen / zu verwenden ODER muss ich einen Typ erstellen- & gt; Regel erstellen- & gt; Den erstellten Typ verwenden; wie in dem folgenden Artikel angegeben?

Ссылка

Wenn dies die einzige Möglichkeit ist, Unsigned in SQL zu verwenden, gibt es einen Nachteil / Nachteil bei der Verwendung?

    
user899055 01.09.2011, 07:31
quelle

3 Antworten

11

Der wichtigste (und eher kritische) Nachteil ist, dass die von Ihnen angegebene Verbindung anscheinend nicht das tut, was Sie denken.

Es wird lediglich ein neuer Integer-Typ erstellt, der nur positiv sein kann. Es bietet jedoch keinen Platzgewinn, der sich aus der Verwendung eines unsignierten Feldes ergeben würde (was Ihr Hauptziel zu sein scheint). Das heißt, dass der maximale Wert ihrer unsignedSmallint der gleiche wäre wie der maximale Wert für smallint , Sie würden daher immer noch diese zusätzlichen Bits verschwenden (aber mehr, da Sie keine negativen Werte einfügen können).

Das heißt, dass ihre unsignedInt keine Werte über 2 ^ 31-1 zulassen würde.

Ich verstehe und weiß, dass in 100 Millionen Zeilen die Einsparungen bei der Verwendung von int32 und int64 in einer einzelnen Spalte bei etwa 380MB liegen. Vielleicht ist der beste Weg für Sie, dies zu tun, um Ihren gespeicherten Wert nach dem Lesen zu versetzen, idealerweise innerhalb einer Ansicht und nur gelesen von dieser Ansicht, und dann, wenn Sie eine Insert hinzufügen, fügen Sie -2 ^ 31 zum Wert hinzu .. Das Problem ist dann aber, dass das Parsing für int32 vor dem Einfügen erfolgt, so dass INSTEAD OF trigger nicht funktionieren. (Ich kenne keine Möglichkeit, einen INSTEAD OF-Trigger zu erstellen, der andere Typen akzeptiert als die Eigner Tabelle)

Stattdessen besteht die einzige Möglichkeit darin, gespeicherte Prozeduren für set des Werts zu verwenden. Sie können dann entweder eine Ansicht oder eine gespeicherte Prozedur verwenden, um den Wert zurückzuerhalten:

%Vor%

Dies kann getestet werden mit:

%Vor%

Sie werden sehen, dass die Werte unsigned zurückgegeben werden, die zurückgegebenen Werte sind jedoch int64 und nicht unsigned32, sodass Ihre Anwendung sie so behandeln muss, als wären sie noch int64.

Wenn Sie einen Fall haben, in dem Sie deutliche Verbesserungen sehen werden (wie fast jede Spalte in der Tabelle doppelt so groß ist wie sonst), dann könnte die obige Anstrengung gerechtfertigt sein, sonst würde ich einfach bleiben mit bigint statt.

    
Seph 01.09.2011, 09:10
quelle
3

Um signiertes smallint in eine vorzeichenlose Zahl zu konvertieren, versuchen Sie Folgendes:

%Vor%

Um signed int in eine vorzeichenlose Zahl zu konvertieren, versuchen Sie

%Vor%

Wenn zum Beispiel Ihr Tabellenfeld x ein Smallint ist und Sie den unsigned Wert zurückgeben wollen, dann versuchen Sie es mit

%Vor%     
boston engineer 11.06.2014 14:24
quelle
2

Die geeignete Lösung hängt von dem Problem ab, das Sie lösen möchten. Wenn dies ein Identitätsfeld ist und Ihr Ziel darin besteht, die Anzahl der Zeilen in Ihrer Tabelle zu verdoppeln, ohne 4 zusätzliche Bytes pro Zeile zu speichern, um ein Bigint zu verwenden, dann setzen Sie das Feld einfach auf -2.147.483.648 statt auf 1. Wenn nötig Speichere Werte größer als 2,147 Milliarden, dann gehe mit einem größeren Datentyp.

    
Tim F 03.04.2013 19:57
quelle