Warum unterstützt SQL Server keinen vorzeichenlosen Datentyp?

81

Ich denke speziell an unsigniert int.

Hier ist ein praktisches Beispiel: Was tun Sie, wenn Ihre Identitätsspalte maximal ist? Es ist möglich, entweder zu gehen BigInt(8-Byte-Speicher statt 4) oder die Anwendung zu überarbeiten, um negative Ganzzahlen zu unterstützen, und sogar eigene Regeln zu erstellen, wie in dieser Antwort angegeben . Keine dieser Optionen ist optimal.

UInt wäre eine ideale Lösung, aber SQL Server bietet sie nicht an (wo MySQL dies tut).

Ich verstehe, dass vorzeichenlose Datentypen nicht Teil des SQL-Standards (SQL-2003) sind, aber dennoch als Verschwendung erscheinen.

Was ist der Grund dafür, dass diese nicht enthalten sind (in SQL Server oder im Standard)?

Romhein
quelle
11
Fragen Sie das SQL Server-Designteam ..... auch: Werden Sie wirklich sogar 2 MILLIARDEN INT-IDENTITÄTS-Werte maximal nutzen? JA WIRKLICH?!?!?! Wenn Sie mehr als 2 Milliarden Zeilen von allem haben, womit Sie es zu tun haben, können Sie bestimmt etwas Speicherplatz sparen und einen BIGINT als IDENTITÄT verwenden ....
marc_s
6
Was meinst du mit marc_s? Das ist nur eine Einfügung alle 800 ms für 50 Jahre hintereinander. Haben Ihre Tische keine solche Aktivität? :)
Mike M.
21
@Mike M: Nicht alle von uns arbeiten an Mickey-Mouse-Apps ... wir haben in weniger als 2 Jahren mehr als 3 Milliarden Bigint verwendet. Die Spitze beträgt> 2000 Zeilen pro Sekunde.
Gbn
5
@gbn Ich wollte nicht implizieren, dass niemand diese Last hatte. Wie bereits gesagt, wenn Sie mehr als 2000 Zeilen pro Sekunde haben, hilft eine zusätzliche 2B Ihrer Sache nicht.
Mike M.
9
@Mike M und @marc_s, wenn ich an einem System mit einer Tabelle mit 2 Milliarden Zeilen gearbeitet habe, kann ich auf verschwendeten Speicher achten. Ich kann auf die Indexseitengröße und die Index-Scan-Leistung achten. Unter solchen Bedingungen möchte ich keinen Platz verschwenden.
Romhein

Antworten:

63

Wenn ich raten müsste, würde ich sagen, dass sie versuchen, eine Verbreitung von Typen zu vermeiden. Im Allgemeinen kann eine vorzeichenlose Ganzzahl nichts tun, was eine vorzeichenbehaftete Ganzzahl nicht kann. Wenn Sie eine Nummer zwischen 2147483648 und 4294967296 benötigen, sollten Sie wahrscheinlich eine 8-Byte-Ganzzahl verwenden, da die Nummer schließlich auch 4294967296 überschreitet.

Jeff Hornby
quelle
2
Ich denke, dies ist die beste Antwort auf diese Frage. Vielen Dank.
Romhein
8
Wenn 'Proliferation von Typen' etwas Platz / Geld hätte sparen können, warum könnte dies das Böse gewesen sein?
Samuel
1
Das Abrufen von Zeilen nach ihrem Wert ist auch langsamer (dh ORDER BY ABS(Id)), insbesondere wenn die Spalte ein gruppierter Primärschlüssel ist. Beispielsweise ist die Verwendung eines 32-Bit-Unix-Zeitstempels häufig eine praktische Möglichkeit, um 4 Byte einer Standard-SQL-Datumszeit zu sparen.
Groo
52

Zu diesem Zweck können Sie -2,147,483,648 als Startwert verwenden.

Identity(-2147483648, 1)
CFreitas
quelle
45

Ich habe eine ähnliche Frage im Microsoft Office Dev Center gefunden.

Die Antwort von Jim Hogg (Programmmanager) enthält einige Vor- und Nachteile für das Hinzufügen von nicht signierten Ints. Der Hauptnachteil ist, dass die Regeln zum Implementieren impliziter Typkonvertierungen zu einem Albtraum werden, um richtig zu werden.

Die Anfrage wurde als "Won't Fix" geschlossen.

Anthony K.
quelle
Der Link funktioniert nicht mehr, daher kann ich die ursprüngliche Antwort nicht lesen. Aber ich glaube, dass das Problem nicht darin besteht, dass es ein Albtraum ist; Es gibt keinen Standard, der besagt, wie es geht. Sie könnten das tun, was MySQL zum Beispiel tut (ich glaube nicht, dass andere DBMS UNSIGNED unterstützen), aber wenn ein anderes DBMS Unterstützung für Zeichen hinzufügt, könnten sie andere Regeln verwenden. Das Conversion-Design ist eine wichtige Angelegenheit. JavaScript ist ein Beispiel dafür, was passiert, wenn es nicht ernst genommen wird.
Federico Razzoli
Aktualisierter Link - Jim Hoggs Kommentar zum MSSN Office Developers Forum.
Anthony K
1

Sie unterstützen das Schlüsselwort SIGNED und UNSIGNED nicht, da sie nicht Standard sind. Im SQL-Standard sind alle numerischen Typen signiert.

UNSIGNED (und SIGNED, die Standardeinstellung) sind MySQL-Erweiterungen, die nützlich sein können, um höhere vorzeichenlose Zahlen in der gleichen Anzahl von Bytes zu speichern und negative Zahlen nicht zuzulassen.

Federico Razzoli
quelle