SQLite serait-il moins utile sans accepter des insertions de valeurs non numériques dans des colonnes numériques?

10

Dans SQLite, l'instruction suivante réussirait et la chaîne serait insérée / mise à jour dans la SALARYcolonne de type INTEGER:

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

Notez que zéro ne sera pas inséré / mis à jour mais la chaîne "TOO MUCH" réelle , donc il ne s'agit pas de conversion de type authomatique.

La FAQ indique:

C'est une fonctionnalité , pas un bug. SQLite utilise le typage dynamique. Il n'applique pas les contraintes de type de données. Les données de tout type peuvent (généralement) être insérées dans n'importe quelle colonne. Vous pouvez placer des chaînes de longueur arbitraire dans des colonnes entières, des nombres à virgule flottante dans des colonnes booléennes ou des dates dans des colonnes de caractères. Le type de données que vous affectez à une colonne dans la commande CREATE TABLE ne limite pas les données qui peuvent être placées dans cette colonne. Chaque colonne peut contenir une chaîne de longueur arbitraire. (Il existe une exception: les colonnes de type INTEGER PRIMARY KEY ne peuvent contenir qu'un entier signé 64 bits. Une erreur se produit si vous essayez de placer autre chose qu'un entier dans une colonne INTEGER PRIMARY KEY.)

Donc, ce comportement est clairement intentionnel, néanmoins je me demande pourquoi SQLite a ce comportement, car la plupart des autres bases de données SQL que je connais se comportent assez différemment, elles génèrent une erreur ou convertissent la chaîne 0, lorsque vous essayez d'insérer une chaîne non numérique dans une colonne numérique.

  • La bibliothèque SQLite serait-elle moins utile sans ce comportement?

  • Est-ce fait de par la conception pour garder la bibliothèque petite et rapide?

  • La bibliothèque SQLite serait-elle considérablement plus lente ou plus grande afin d'augmenter les erreurs lors de la tentative d'insertion d'une chaîne dans une colonne numérique?

Tulains Córdova
la source
9
Quelqu'un a dit un jour "qu'une fonctionnalité est un bug tel que décrit par le département marketing".
Dan Pichelman
3
Je doute que ce soit bon pour les performances et la densité des données, bien que cela puisse être bénéfique pour la taille du code. Dans l'ensemble, je dirais que c'est une erreur intentionnelle (ou au moins adoptée).
Déduplicateur
3
"Cela me semble une limitation imposée afin de rester une bibliothèque de petite taille et à faibles ressources habituellement utilisée pour les systèmes embarqués qui nécessitent des performances en temps réel ..." Je ne peux pas imaginer qu'une vérification de type soit autre chose qu'une baisse de le compartiment de performances temps / espace pour les opérations qui effectuent n'importe quelle quantité d'E / S disque. De plus, ils doivent avoir des vérifications supplémentaires dans le code car ils ne peuvent pas simplement supposer que les données auront une taille fixe, donc sans doute le typage dynamique vous coûte des performances.
Doval
1
@DocBrown Pas parce que je le dis mais parce que c'est sui generis .
Tulains Córdova
2
@ user61852 Je vous suggère de réécrire complètement la question et de vous concentrer sur la question de savoir si le typage dynamique de SQLite lui apporterait des avantages en termes de performances, et d'omettre toute mention de la distinction fonctionnalité / bogue ou de l'utilité / inutilité générale du typage dynamique dans le contexte X ou Y.
Doval

Réponses:

8

Non, la frappe dynamique nécessite à la fois plus d'espace de stockage et plus de temps de traitement, d'autant plus qu'ils ajoutent également une affinité de type, ce qui signifie qu'il a un type préféré que le programmeur est libre d'ignorer. C'est vraiment une caractéristique intentionnelle avec des coûts de compromis réels. Ces coûts sont effectivement négligeables pour les cas d'utilisation des cibles SQLite, mais ils sont toujours là.

L'utilité de telles fonctionnalités est difficile à voir car vous n'êtes pas habitué à les avoir à votre disposition. La solution pour son manque vous semble plus naturelle maintenant. En raison de votre expérience antérieure, vous le considérez comme un champ INTEGER qui ne sera jamais rien d'autre, mais SQLite le voit plus comme un champ de tout type, mais contiendra probablement principalement des entiers. Il s'agit peut-être d'un code postal pour une entreprise qui fait principalement des affaires aux États-Unis, mais qui compte une poignée de clients canadiens. Permettre à l'utilisateur de spécifier une affinité entière économisera beaucoup d'espace en en faisant une chaîne dans chaque ligne, mais vous donne toujours cette option.

Karl Bielefeldt
la source
3
J'ai écrit une mise à jour de ma question sur le stockage réussi de la chaîne "TOO MUCH" dans une colonne numérique. La conversion automatique insérerait zéro. C'est aussi la première implémentation de base de données relationnelle que je connais qui permettrait cela. J'ai travaillé avec MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL et Sybase SQL Anywhere.
Tulains Córdova
2
Je ne comprends pas votre commentaire. Rien dans ma réponse n'a rien à voir avec la conversion automatique.
Karl Bielefeldt
1
SQLite les considère comme des classes de stockage au lieu de types de données. sqlite.org/datatype3.html
JeffO
1
Upvoted pour être clairement écrit, mais vous êtes sans tenir compte des problèmes que cela cause à prouver l' exactitude des données. Vous ne pouvez pas extraire certains entiers de votre base de données et supposer qu'ils seront des entiers. (Le "typage dynamique" est en totale contradiction avec le modèle relationnel lui-même .)
Wildcard
1
Les coûts d'ignorer complètement la saisie sont bien plus élevés qu'un petit espace de stockage et du temps processeur.
DeadMG