Einführung in Datentypen in SQL
Im Gegensatz zu JavaScript verfügt SQL über eine starke Typisierung. In jeder Tabelle hat jede Spalte ihren eigenen festen Datentyp.
Es gibt viele Datentypen, aber im Gegensatz zur Java-Sprache gibt es nicht so viele davon, weil es Datentypen für alle Gelegenheiten gibt. Datenbanken sind stark von der Größe der Daten abhängig, daher unterscheiden sich viele Datentypen nur in der Länge voneinander.
Insgesamt lassen sich Datentypen in 5 Gruppen einteilen:
- Numerische Typen
- String -Typen
- Typen zum Speichern von Datum und Uhrzeit
- Objekte: werden normalerweise als eine Sammlung von Bytes dargestellt
- Transport : JSON und XML
Normalerweise haben verschiedene DBMS immer noch ihre eigenen Datentypen. Jedes DBMS hat seine eigene Spezialisierung, daher kommt es häufig vor, dass neue Datentypen hinzugefügt werden.
Eine andere Sache ist, dass das bloße Hinzufügen eines neuen Datentyps nicht ausreicht. Sie müssen Funktionen hinzufügen, die damit funktionieren, und dies auch bequem und schnell machen.
Wenn Sie an einem industriellen (Unternehmens-)DBMS arbeiten, müssen Sie sich höchstwahrscheinlich mit dessen Datentypen und Funktionen auseinandersetzen. Dafür müssen Sie 2-5 gute Bücher lesen.
Im Rahmen unserer Bekanntschaft mit SQL werden wir drei Hauptgruppen von Datentypen betrachten:
- Zahlen
- Saiten
- Termine
Numerische Typen in SQL
In SQL werden numerische Typen in drei Gruppen unterteilt:
- Ganzzahltypen
- Festkommazahlen (feste Anzahl an Nachkommastellen)
- Gleitkommazahlen
Beginnen wir mit ganzen Zahlen . Es gibt nur 5 davon und sie können in einer Tabelle beschrieben werden:
# | Modellname | Länge in Bytes | Analog aus Java | Mindestwert | Höchster Wert |
---|---|---|---|---|---|
1 | WINZIG | 1 | Byte | -128 | 127 |
2 | KLEININT | 2 | kurz | -32.768 | 32.767 |
3 | MITTELMINZE | 3 | -8.388.608 | 8.388.607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | BIGINT | 8 | lang | -2 63 | 2 63-1 |
Die Datentypen sind den Java-Datentypen sehr ähnlich, es gibt jedoch auch einen Integer-Typ, der drei Bytes lang ist. Dies geschieht, um Platz zu sparen.
Als nächstes kommen die Gleitkommatypen , genau wie in Java gibt es nur zwei davon:
# | Modellname | Länge in Bytes | Analog aus Java | Mindestwert | Höchster Wert |
---|---|---|---|---|---|
1 | SCHWEBEN | 4 | schweben | -3,40E+38 | +1,18E+38 |
2 | DOPPELT | 8 | doppelt | -1,79E+308 | +1,79E+308 |
Wieder nichts Neues. Alles ist wie in Java. Im Gegensatz zu Java gibt es in SQL jedoch einen weiteren speziellen Typ, die Festkomma-Realzahl. Es heißt DEZIMAL.
Typischerweise wird dieser Typ zum Speichern von Geldbeträgen verwendet. Wenn der Name dieses Typs geschrieben wird, wird normalerweise danach angegeben, wie viele Dezimalstellen die Zahl vor und nach dem Dezimalpunkt hat. Das allgemeine Format sieht so aus:
DECIMAL(total_characters, after_comma)
Und ein kleines Beispiel:
salary DECIMAL(5,2)
So haben wir die Tatsache beschrieben, dass die Gehaltsspalte ganze Zahlen (maximal 3 Dezimalstellen) und einen Bruchteil – 2 Dezimalstellen – enthalten kann.
Die maximale Anzahl von Zeichen, die der Typ DECIMAL unterstützt, beträgt 65.
String-Typen in SQL
Zeilen in einer Datenbank können in zwei Formen gespeichert werden:
- Zeichenfolgen mit fester Länge
- Strings mit variabler Länge
Zeichenfolgen fester Länge werden als CHAR angegeben :
CHAR(length)
Feste Länge bedeutet, dass alle Werte dieser Spalte eine streng festgelegte Anzahl von Zeichen enthalten.
Ein Beispiel für eine Zeichenfolge fester Länge:
country_code CHAR(2)
Zeichenfolgen variabler Länge werden durch den Typ VARCHAR angegeben :
VARCHAR(max_length)
Variable Länge bedeutet, dass alle Werte dieser Spalte Text beliebiger Länge enthalten, jedoch nicht länger als die maximale Länge.
Beispiel für eine Zeichenfolge mit variabler Länge:
phone VARCHAR(12)
Saiten mit fester Länge haben einen sehr großen Vorteil. Wenn der Client den SQL-Server auffordert, ihm die 1.000.000ste Zeile aus der Tabelle zurückzugeben, und die Zeilen in der Tabelle eine feste Länge haben, können Sie, wenn Sie die Länge der Zeile kennen, leicht die Bytes berechnen, die sich auf die gewünschte beziehen Reihe.
Bei variabler Zeilenlänge ist es nicht möglich, die gewünschte Zeile in der Tabelle schnell zu finden. Denken Sie an die Zugriffsgeschwindigkeit auf ArrayList und LinkedList. Die Situation ist hier ungefähr dieselbe.
Vergleichen wir, wie Zeichenfolgen unterschiedlicher Länge je nach Datentyp in einer Tabelle gespeichert werden.
Linie | CHAR(4) | Zu speicherndes Byte | VARCHAR(4) | Zu speicherndes Byte | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'A B C D' | 'A B C D' | 4 | 'A B C D' | 5 | |
'A B C D E F G H' | 'A B C D' | 4 | 'A B C D' | 5 |
Notiz. Der Typ VARCHAR benötigt für die gleiche Länge ein weiteres Byte, da er zusätzlich die Länge des Strings speichern muss.
Temporäre Typen in SQL
SQL verfügt außerdem über spezielle Typen zum Speichern von Datums- und Uhrzeitangaben. Insgesamt gibt es fünf Typen:
# | Modellname | Analog zur Java DateTime API | Beispiel | Mindestwert | Höchster Wert |
---|---|---|---|---|---|
1 | DATUM | Lokales Datum | '30.06.2022' | '1000-01-01' | '9999-12-31' |
2 | ZEIT | Ortszeit | 'hh:mm:ss[.fraction]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | TERMINZEIT | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | ZEITSTEMPEL | Datum | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | JAHR | 1901 | 2155 |
Alle Daten in Abfragen werden als Zeichenfolge geschrieben – in einfachen Anführungszeichen. Das Eingabeformat reicht vom größten zum kleinsten:
- Jahr
- Monat
- Tag
- Stunde
- Minute
- Zweite
- Bruchteile einer Sekunde
Die Typen DATE, TIME und DATETIME können konventionell als Analoga der Typen aus der Java DateTme-API betrachtet werden: LocalDate, LocalTime, LocalDateTime. Die Logik ist ungefähr dieselbe.
Der Typ TIMESTAMP speichert Daten in Millisekunden seit Anfang 1970 (ein UNIX-Betriebssystemstandard). In dieser Form werden sie vom Typ Date in der Java-Sprache gespeichert.
Und schließlich gibt es noch den Typ YEAR, der 1 Byte lang ist und Werte von 1 bis 255 speichert. Daher liegt der verfügbare Jahresbereich zwischen 1901 und 2155. Das Jahr 1900 kann mit diesem Typ nicht gespeichert werden, da der Wert 0 zur Kodierung eines NULL-Wertes verwendet wird.
Objekte in SQL speichern
Für die Speicherung von Objekten oder Texten großer Länge gibt es spezielle Typen. Wir gehen nicht näher darauf ein, aber ich liste sie trotzdem auf:
# | Modellname | Erläuterung |
---|---|---|
1 | TEXT | Wird zum Speichern langer Texte verwendet. Beim Vergleich und Sortieren in diesem Feld werden nur die ersten 100 Zeichen verwendet. |
2 | KLECKS | Der Name steht für Byte Large Object. Wird nur als Sammlung von Bytes gespeichert. Kann beispielsweise zum Speichern von Bildern in einer Datenbank verwendet werden. |
3 | CLOB | Der Name steht für Char Large Object. Wird zum Speichern langer Texte verwendet. |
4 | ENUM | Ermöglicht Ihnen, einen festen Satz von Werten festzulegen und einen davon als Wert zu speichern. |
5 | SATZ | Ermöglicht Ihnen, einen festen Satz von Werten festzulegen und eine beliebige Teilmenge davon als Wert zu speichern. Speichert sie normalerweise als Binärmaske. |
Theoretisch können Sie jedes Java-Objekt als Satz von Bytes serialisieren und als BLOB in der Datenbank speichern. Das Speichern des Objekts ist kein Problem. Wie kann man weiter mit ihm zusammenarbeiten?
Nehmen wir an, eine Tabelle speichert eine Million Objekte in serialisierter Form – wie durchsuchen Sie sie? Ein DBMS unterstützt einen bestimmten Datentyp nur dann, wenn es umfangreiche Funktionen für die Arbeit damit bereitstellt.