Warum sind auf den wichtigsten Datenbankplattformen keine vorzeichenlosen Ganzzahltypen verfügbar?

15

Datenbanken sind normalerweise mit unterschiedlichen Datentypen und benutzerdefinierten Längen sehr anpassbar.

Es überrascht mich, als ich versuche, nach der Syntax zu suchen, um unsigned intTypen zu verwenden , die weder von PostgreSQL noch von MS SQL Server verfügbar sind. MySQL und Oracle scheinen zu.

Dies scheint ein eklatantes Versäumnis zu sein - die nächstbeste Perfomant-Option ist long / bigint (8-Byte-Ganzzahl), könnte aber völlig unnötig sein! Weiß jemand, warum er sich dafür entscheidet, native nicht signierte int-Unterstützung nicht einzuschließen?

Ehryk
quelle
2
Portable == Standard mandatiert. Der C-Standard spezifiziert nicht die Breite gewöhnlicher Inches oder Longs, sondern nur minimale Bereiche darstellbarer Zahlen. Plattformen mit 16-Bit-Ints waren irgendwann üblich. 64bit ist möglich. 36 auch (obwohl ausgestorben). 24 passiert (DSPs). Wie oft haben Sie Daten, die in 32-Bit, aber nicht in 31-Bit passen, und Sie haben gemessen, dass die Verwendung normaler numerischer Typen zu Leistungseinbußen führt?
Mat
2
Sowohl SQL-Server als auch Postgres NUMERIC(10)erlauben ganze Zahlen bis 9.999.999.999(und mit einer Einschränkung können Sie negative Werte nicht zulassen.)
ypercubeᵀᴹ
4
Aus einem Grund: Sie sind im SQL-Standard nicht spezifiziert. Für eine längere Diskussion über Postgres schauen Sie sich diese Diskussion an: postgresql.1045698.n5.nabble.com/… und diese: postgresql.1045698.n5.nabble.com/…
a_horse_with_no_name
2
Für SQL Server finden Sie hier eine Erklärung
Martin Smith
1
@Mat Ich mache mir keine Sorgen um die Leistung, es werden 4 zusätzliche Bytes x 153 Millionen = ~ 612 zusätzliche MB verschwendet, die Werte liegen über 3 Milliarden, aber nicht über 4 Milliarden. Eine Zahl (10) hat Leistungstreffer und benötigt 9 Byte Speicherplatz: msdn.microsoft.com/en-us/library/ms187746.aspx
Ehryk

Antworten:

14

Microsofts Jim Hogg hat auf dieses Problem wie folgt geantwortet:

Es gibt Vor- und Nachteile. Auf der Pro-Seite scheint es eine gute Möglichkeit zu sein, Fehler zu vermeiden - ein (vorzeichenbehaftetes) int muss auf einen Wert> 0 überprüft werden. Und ich würde auch wagen, dass sich viele Verwendungen von int tatsächlich auf Zählungen beziehen, die sowieso niemals negativ sein sollten . Zur Frage der Verdoppelung der maximalen Zeilenanzahl? - stimmt, aber ich würde sagen, das ist weniger überzeugend.

Was die Nachteile angeht ... das Mischen von vorzeichenbehafteten / vorzeichenlosen Typen in C oder C ++ scheint einfach genug zu sein. Es ist nicht. Es öffnet eine kleine Liste schwer zu findender Fehler - vor allem aufgrund der komplexen Regeln für implizite Werbeaktionen / Erweiterungen. Leider hat SQL bereits einen noch komplexeren Satz von impliziten Casting-Regeln. Unsignierte Ints hinzuzufügen, würde uns alle noch mehr verwirren.

Ich werde diesen Vorschlag in den Büchern behalten. Aber unter all den Merkmalen, die wir hinzufügen könnten / sollten, steht dieses in Bezug auf die Frage nicht ganz oben auf dieser Liste.

Quelle: Microsoft Connect

Ich würde die Liste der Profis erheblich erweitern und betonen, dass die SQL-Engine bereits weitaus komplexere Aufgaben ausführt, sodass das Team mit der zusätzlichen Komplexität umgehen kann. Ich bin zwar nicht mit der Summe einverstanden, aber aus diesem Grund unterstützt SQL Server keine vorzeichenlosen Typen .

Der Connect-Link wurde ursprünglich von Martin Smith in den Fragenkommentaren gepostet .

Ehryk
quelle
3
"verwirren uns alle noch mehr" - bezieht sich wahrscheinlich auf jeden, der SQL Server verwendet, nicht nur auf sein eigenes Entwicklungsteam.
Oskar Berggren