SQLite sarebbe meno utile senza accettare inserimenti di valori non numerici in colonne numeriche?


10

In SQLite la seguente istruzione avrebbe esito positivo e la stringa verrebbe inserita / aggiornata nella SALARYcolonna di tipo INTEGER:

update employee set salary='TOO MUCH' where emp_id=1;

Si noti che zero non verrà inserito / aggiornato ma la stringa "TOO MUCH" effettiva , quindi non si tratta della conversione del tipo automatico.

Le FAQ indicano:

Questa è una funzione , non un bug. SQLite utilizza la digitazione dinamica. Non impone vincoli di tipo di dati. I dati di qualsiasi tipo possono (di solito) essere inseriti in qualsiasi colonna. È possibile inserire stringhe di lunghezza arbitraria in colonne intere, numeri in virgola mobile in colonne booleane o date in colonne di caratteri. Il tipo di dati assegnato a una colonna nel comando CREATE TABLE non limita i dati che possono essere inseriti in quella colonna. Ogni colonna è in grado di contenere una stringa di lunghezza arbitraria. (C'è un'eccezione: le colonne di tipo INTEGER PRIMARY KEY possono contenere solo un numero intero con segno a 64 bit. Si verificherà un errore se si tenta di inserire qualcosa di diverso da un numero intero in una colonna INTEGER PRIMARY KEY.)

Quindi questo comportamento è chiaramente intenzionale, tuttavia mi chiedo perché SQLite abbia questo comportamento, poiché la maggior parte degli altri database SQL che conosco si comportano in modo abbastanza diverso, genererebbero un errore o convertiranno la stringa 0, quando provano a inserire una stringa non numerica in una colonna numerica.

  • La libreria SQLite sarebbe meno utile senza questo comportamento?

  • Questo è stato progettato in modo tale da mantenere la libreria piccola e veloce?

  • La libreria SQLite sarebbe significativamente più lenta o più grande al fine di generare errori quando si tenta di inserire una stringa in una colonna numerica?


9
Qualcuno una volta ha affermato che "una funzionalità è un bug come descritto dall'ufficio marketing".
Dan Pichelman,

3
Dubito che sia buono per le prestazioni e la densità dei dati, anche se potrebbe essere utile per la dimensione del codice. Tutto sommato, lo definirei un malfunzionamento intenzionale (o per lo meno adottato).
Deduplicatore

3
"Mi sembra un limite imposto per rimanere una libreria di piccole dimensioni e di risorse ridotte normalmente utilizzata per il sistema incorporato che richiede prestazioni in tempo reale ..." Non riesco a immaginare un controllo del tipo che sia qualcosa di più di un semplice calo il bucket prestazioni tempo / spazio per operazioni che eseguono qualsiasi quantità di I / O su disco. Inoltre devono avere ulteriori controlli nel codice poiché non possono semplicemente supporre che i dati abbiano dimensioni fisse, quindi probabilmente la tipizzazione dinamica costa le prestazioni.
Doval,

1
@DocBrown Non perché lo dico ma perché è sui generis .
Tulains Córdova,

2
@ user61852 Ti suggerisco di riscrivere completamente la domanda e di concentrarti sul fatto se la tipizzazione dinamica di SQLite le darebbe vantaggi in termini di prestazioni e omettere qualsiasi menzione della distinzione caratteristica / bug o dell'utilità / inutilità generale della tipizzazione dinamica nel contesto X o Y.
Doval,

Risposte:


8

No, la digitazione dinamica richiede sia più spazio di archiviazione sia più tempo di elaborazione, soprattutto perché aggiungono anche affinità di tipo, il che significa che ha un tipo preferito che il programmatore è libero di ignorare. È veramente una caratteristica intenzionale con costi di scambio reali. Tali costi sono effettivamente trascurabili per i casi d'uso target SQLite, ma sono ancora lì.

L'utilità di tali funzionalità è difficile da vedere perché non sei abituato a averlo a tua disposizione. La soluzione alternativa per la sua mancanza ora ti sembra più naturale. A causa della tua precedente esperienza, lo stai pensando come un campo INTEGER che non dovrebbe mai essere nient'altro, ma SQLite lo vede più come un campo di qualsiasi tipo, ma probabilmente conterrà prevalentemente numeri interi. Forse si tratta di un codice postale per un'azienda che opera principalmente negli Stati Uniti, ma ha una manciata di clienti canadesi. Consentire all'utente di specificare un'affinità intera risparmierà molto spazio rispetto a renderlo una stringa in ogni riga, ma ti darà comunque quell'opzione.


3
Ho scritto un aggiornamento alla mia domanda sulla memorizzazione corretta della stringa "TROPPO" in una colonna numerica. La conversione automatica inserisce zero. Anche questa è la prima implementazione di database relazionale che conosco che lo consentirebbe. Ho lavorato con MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL e Sybase SQL Anywhere.
Tulains Córdova,

2
Non capisco il tuo commento. Nulla della mia risposta aveva a che fare con la conversione automatica.
Karl Bielefeldt,

1
SQLite li considera classi di archiviazione anziché tipi di dati. sqlite.org/datatype3.html
JeffO

1
Upvoted per essere scritto chiaramente, ma si sta ignorando i problemi che ciò causa a dimostrare la precisione dei dati. Non puoi estrarre alcuni numeri interi dal tuo DB e supporre che saranno numeri interi. (La "tipizzazione dinamica" è in netto contrasto con l'attuale modello relazionale stesso .)
Wildcard il

1
I costi per ignorare completamente la digitazione sono di gran lunga superiori a poco spazio di archiviazione e tempo del processore.
DeadMG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.