In SQLite wäre die folgende Anweisung erfolgreich und die Zeichenfolge würde in die SALARY
Spalte vom Typ eingefügt / aktualisiert INTEGER
:
update employee set salary='TOO MUCH' where emp_id=1;
Beachten Sie, dass Null nicht eingefügt / aktualisiert wird, sondern die eigentliche Zeichenfolge "TOO MUCH". Es handelt sich also nicht um eine authomatische Typkonvertierung.
In den FAQ heißt es:
Dies ist eine Funktion , kein Fehler. SQLite verwendet die dynamische Typisierung. Es werden keine Datentypeinschränkungen erzwungen. Daten jeglicher Art können (normalerweise) in jede Spalte eingefügt werden. Sie können Zeichenfolgen beliebiger Länge in Ganzzahlspalten, Gleitkommazahlen in Booleschen Spalten oder Datumsangaben in Zeichenspalten einfügen. Der Datentyp, den Sie einer Spalte im Befehl CREATE TABLE zuweisen, schränkt nicht ein, welche Daten in diese Spalte eingefügt werden können. Jede Spalte kann eine Zeichenfolge beliebiger Länge enthalten. (Es gibt eine Ausnahme: Spalten vom Typ INTEGER PRIMARY KEY dürfen nur eine 64-Bit-Ganzzahl mit Vorzeichen enthalten. Ein Fehler tritt auf, wenn Sie versuchen, etwas anderes als eine Ganzzahl in eine Spalte INTEGER PRIMARY KEY einzufügen.)
Dieses Verhalten ist also eindeutig beabsichtigt, dennoch frage ich mich, warum SQLite dieses Verhalten hat, da sich die meisten anderen mir bekannten SQL-Datenbanken ganz anders verhalten und einen Fehler verursachen oder die Zeichenfolge 0 konvertieren würden, wenn versucht wird, eine nicht numerische Zeichenfolge in einzufügen eine numerische Spalte.
Wäre die SQLite-Bibliothek ohne dieses Verhalten weniger nützlich?
Ist dies beabsichtigt, um die Bibliothek klein und schnell zu halten?
Wäre die SQLite-Bibliothek erheblich langsamer oder größer, um Fehler zu verursachen, wenn versucht wird, eine Zeichenfolge in eine numerische Spalte einzufügen?
Antworten:
Nein, die dynamische Typisierung erfordert sowohl mehr Speicherplatz als auch mehr Verarbeitungszeit, zumal sie auch die Typaffinität erhöht, was bedeutet, dass es einen bevorzugten Typ gibt, den der Programmierer ignorieren kann. Es ist wirklich eine absichtliche Funktion mit echten Kompromisskosten. Diese Kosten sind für die SQLite-Anwendungsfälle praktisch vernachlässigbar, aber sie sind immer noch vorhanden.
Die Nützlichkeit solcher Funktionen ist schwer zu erkennen, da Sie es nicht gewohnt sind, sie zur Verfügung zu haben. Die Problemumgehung für ihren Mangel fühlt sich für Sie jetzt natürlicher an. Aufgrund Ihrer bisherigen Erfahrung betrachten Sie es als ein INTEGER-Feld, das niemals etwas anderes sein soll, aber SQLite sieht es eher als ein Feld jeglichen Typs, das wahrscheinlich hauptsächlich Ganzzahlen enthält. Vielleicht ist es eine Postleitzahl für ein Unternehmen, das hauptsächlich in den USA geschäftlich tätig ist, aber eine Handvoll kanadischer Kunden hat. Wenn Sie dem Benutzer erlauben, eine ganzzahlige Affinität anzugeben, sparen Sie viel Platz, wenn Sie sie in jeder Zeile zu einer Zeichenfolge machen, aber Sie haben trotzdem diese Option.
quelle