Dans SQLite, l'instruction suivante réussirait et la chaîne serait insérée / mise à jour dans la SALARY
colonne 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?