Wäre SQLite weniger nützlich, ohne Einfügungen nicht numerischer Werte in numerische Spalten zu akzeptieren?

10

In SQLite wäre die folgende Anweisung erfolgreich und die Zeichenfolge würde in die SALARYSpalte 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?

Tulains Córdova
quelle
9
Jemand hat einmal gesagt, dass "eine Funktion ein Fehler ist, wie von der Marketingabteilung beschrieben".
Dan Pichelman
3
Ich bezweifle, dass es gut für die Leistung und die Datendichte ist, obwohl es für die Codegröße von Vorteil sein könnte. Alles in allem würde ich es eine absichtliche (oder zumindest angenommene) Fehlfunktion nennen.
Deduplikator
3
"Es scheint mir eine auferlegte Einschränkung zu sein, um eine kleine Bibliothek mit geringen Ressourcen zu bleiben, die normalerweise für eingebettete Systeme verwendet wird, die Echtzeitleistung erfordern ..." Ich kann mir nicht vorstellen, dass eine Typprüfung mehr als ein Drop-In ist Der Zeit- / Raumleistungs-Bucket für Vorgänge, die eine beliebige Menge an Festplatten-E / A ausführen. Außerdem müssen sie zusätzliche Überprüfungen im Code vornehmen, da sie nicht einfach davon ausgehen können, dass die Daten eine feste Größe haben werden. Die dynamische Eingabe kostet Sie also wahrscheinlich die Leistung.
Doval
1
@ DocBrown Nicht weil ich es sage, sondern weil es sui generis ist .
Tulains Córdova
2
@ user61852 Ich schlage vor, dass Sie die Frage vollständig umschreiben und sich darauf konzentrieren, ob die dynamische Typisierung von SQLite Leistungsvorteile bringt, und die Erwähnung der Unterscheidung zwischen Merkmalen und Fehlern oder der allgemeinen Nützlichkeit / Nutzlosigkeit der dynamischen Typisierung im X- oder Y-Kontext weglassen.
Doval

Antworten:

8

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.

Karl Bielefeldt
quelle
3
Ich habe ein Update zu meiner Frage über das erfolgreiche Speichern der Zeichenfolge "TOO MUCH" in einer numerischen Spalte geschrieben. Die automatische Konvertierung würde Null einfügen. Dies ist auch die erste relationale Datenbankimplementierung, von der ich weiß, dass sie dies ermöglichen würde. Ich habe mit MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL und Sybase SQL Anywhere gearbeitet.
Tulains Córdova
2
Ich verstehe deinen Kommentar nicht. Nichts an meiner Antwort hatte etwas mit automatischer Konvertierung zu tun.
Karl Bielefeldt
1
SQLite betrachtet sie als Speicherklassen anstelle von Datentypen. sqlite.org/datatype3.html
JeffO
1
Upvoted für deutlich geschrieben werden, aber Sie werden ignoriert Dadurch werden die Probleme in Genauigkeitsdaten beweisen. Sie können einige Ganzzahlen nicht aus Ihrer Datenbank ziehen und davon ausgehen, dass es sich um Ganzzahlen handelt. ("Dynamische Typisierung" steht in starkem Widerspruch zum tatsächlichen relationalen Modell selbst .)
Wildcard
1
Die Kosten für das vollständige Ignorieren der Eingabe sind weitaus höher als ein wenig Speicherplatz und Prozessorzeit.
DeadMG