Wenn ich eine Tabelle in SQLite3 erstelle, bin ich verwirrt, wenn ich mit allen möglichen Datentypen konfrontiert werde, die ähnliche Inhalte implizieren. Kann mir jemand den Unterschied zwischen den folgenden Datentypen erklären?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Gibt es irgendwo eine Dokumentation, in der die min./max. Kapazitäten der verschiedenen Datentypen? Ich denke zum Beispiel, ich habe smallint
einen größeren Maximalwert als tinyint
, aber einen kleineren Wert als die ganze Zahl, aber ich habe keine Ahnung, was diese Kapazitäten sind.
DATE
oder zu deklarierenBOOLEAN
, aber ich würde nicht zwischen verschiedenen Größen von Ganzzahlen unterscheiden. Dies gilt insbesondere für den FallINTEGER PRIMARY KEY
, in dem der genaue Typname von Bedeutung ist.Der Unterschied ist syntaktischer Zucker. Für die Typaffinität sind nur wenige Teilzeichenfolgen der Typnamen von Bedeutung.
Die Regeln zur Bestimmung der Affinität sind auf der SQLite-Site aufgeführt .
Wenn Sie darauf bestehen , auf strikte Typisierung, können Sie es mit implementieren
CHECK
Einschränkungen:Aber ich kümmere mich nie darum.
Wie für die Kapazität jedes Typs:
INTEGER
ist immer 64-Bit signiert. Beachten Sie, dass SQLite die Speicherung kleiner Ganzzahlen hinter den Kulissen optimiert , sodass TINYINT ohnehin nicht nützlich wäre.REAL
ist immer 64-Bit (double
).TEXT
undBLOB
eine maximale Größe haben, die durch ein Präprozessor-Makro bestimmt wird, das standardmäßig 1.000.000.000 Bytes verwendet.quelle
TYPEOF
. Versuche, einen TEXT einzufügen, der andernfalls von SQlite in die Speicherklasse NUMERIC / INTEGER konvertiert würde (dh eine solche Konvertierung ist verlustfrei gemäß sqlite.org/datatype3.html#affinity ), schlagen fehl. Mit anderen Worten, dieser Ansatz ist strenger als der Ad-hoc-Ansatz, den Wert einzufügen und dann die Speicherklasse, die zum Speichern dieses Werts durch SQLite verwendet wird, auf magische Weise zu validieren. Für einen freizügigeren Ansatz siehe meine Antwort unten.Die meisten davon dienen der Kompatibilität. Sie haben wirklich nur Integer, Float, Text und Blob. Daten können entweder als Zahl (Unix-Zeit ist Ganzzahl, Microsoft-Zeit ist Float) oder als Text gespeichert werden.
quelle
NULL
. Der Wert ist ein NULL-Wert.INTEGER
. Der Wert ist eine vorzeichenbehaftete Ganzzahl, die je nach Größe des Werts in 1, 2, 3, 4, 6 oder 8 Byte gespeichert wird.REAL
. Der Wert ist ein Gleitkommawert, der als 8-Byte-IEEE-Gleitkommazahl gespeichert wird.TEXT
. Der Wert ist eine Textzeichenfolge, die mithilfe der Datenbankcodierung (UTF-8, UTF-16BE oder UTF-16LE) gespeichert wird.BLOB
. Der Wert ist ein Datenblock, der genau so gespeichert wird, wie er eingegeben wurde.quelle
Als Ergänzung zur Antwort von dan04, wenn Sie blind eine
NUMERIC
andere als die durch a dargestellte Null einfügen möchten,TEXT
aber sicherstellen möchten, dass der Text in eine Zahl konvertierbar ist :Ein typischer Anwendungsfall ist eine Abfrage eines Programms, das alle Daten als Text behandelt (aus Gründen der Einheitlichkeit und Einfachheit, da SQLite dies bereits tut). Das Schöne daran ist, dass es Konstrukte wie dieses erlaubt:
Dies ist praktisch, wenn Sie Platzhalter verwenden, da Sie solche numerischen Felder ungleich Null nicht speziell behandeln müssen. Ein Beispiel für die Verwendung des Python-
sqlite3
Moduls wäre:Im obigen Beispiel werden alle Werte in
str_value_tuple
maskiert und als Zeichenfolgen in Anführungszeichen gesetzt, wenn sie an SQlite übergeben werden. Da wir den TypTYPEOF
jedoch nicht explizit über überprüfen, sondern nur die Konvertierbarkeit in Typ , funktioniert er weiterhin wie gewünscht (dh SQLite speichert ihn entweder als numerische Zahl oder schlägt anderweitig fehl).quelle