2017-10-14 5 views
1

J'essaie de mieux apprendre le SQL et j'ai donc commencé depuis le début en utilisant sqlite3. Lorsque j'ai essayé d'insérer une valeur de chaîne dans une valeur qui était désignée comme int, cela fonctionnait parfaitement. Quelqu'un peut-il expliquer comment cela est possible?Pourquoi mes chaînes sont-elles acceptées en valeurs int en sql db?

PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE entertainment(num INT, show TEXT, myRating INT); 
INSERT INTO "entertainment" VALUES(1,'Mr. Robot',10); 
INSERT INTO "entertainment" VALUES(7,'Narcos','el classic'); 
INSERT INTO "entertainment" VALUES(8,'Suits',7); 
INSERT INTO "entertainment" VALUES(9,'Friends',"classic"); 
COMMIT; 

Répondre

1

Sqlite3 est très flexible à cet égard. En un mot, sqlite3 va convertir les données si nécessaire ou les stocker comme elles, quel que soit le type que vous spécifiez. Toutefois, en spécifiant les types de données, sqlite3 utilisera ces informations pour stocker les données aussi efficacement que possible. Lorsque vous définissez une colonne comme INTEGER, sqlite3 affecte une affinité de type INTEGER à la colonne. Il y a aussi une affinité de type NUMERIC.

Une colonne avec une affinité NUMERIC peut contenir des valeurs utilisant les cinq classes de stockage. Lorsque les données de texte sont insérées dans une colonne NUMERIC, la classe de stockage du texte est convertie en INTEGER ou REAL (par ordre de préférence) si une telle conversion est sans perte et réversible. Pour les conversions entre les classes de stockage TEXT et REAL, SQLite considère que la conversion est sans perte et réversible si les 15 premiers chiffres décimaux significatifs du nombre sont conservés. Si la conversion sans perte de TEXT en INTEGER ou REAL n'est pas possible, la valeur est stockée en utilisant la classe de stockage TEXT. Aucune tentative n'est faite pour convertir les valeurs NULL ou BLOB.

et l'affinité INTEGER est définie comme suit:

Une colonne d'affinité qui utilise INTEGER se comporte comme une colonne avec une affinité numérique. La différence entre l'affinité INTEGER et NUMERIC n'est visible que dans une expression CAST.

Dans votre cas, sqlite3 ne convertira pas le texte mais le stockera en utilisant la classe de stockage TEXT. Voir la page Datatypes de la référence SQLite pour plus de détails sur les types de données, la classe de stockage et l'affinité de type.

0

https://sqlite.org/faq.html#q3

(3) SQLite me permet d'insérer une chaîne dans une colonne de base de données de type entier!

Ceci 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 n'importe quel type peuvent (généralement) être insérées dans n'importe quelle colonne. Vous pouvez placer des chaînes de longueur arbitraires 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 restreint pas les données pouvant être placées dans cette colonne. Chaque colonne est capable de 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 produira si vous tentez de placer autre chose qu'un entier dans une colonne INTEGER PRIMARY KEY.)

Mais SQLite utilise le type déclaré d'une colonne comme indication que vous préférez des valeurs dans ce format. Ainsi, par exemple, si une colonne est de type INTEGER et que vous essayez d'insérer une chaîne dans cette colonne, SQLite tentera de convertir la chaîne en entier. Si c'est possible, il insère l'entier à la place. Sinon, il insère la chaîne. Cette fonctionnalité est appelée affinité de type.

0

selon la docs

Ceci 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 n'importe quel type peuvent (généralement) être insérées dans n'importe quelle colonne. Vous pouvez placer des chaînes de longueur arbitraires dans des colonnes entières, des nombres à virgule flottante dans des colonnes booléennes ou des dates dans des colonnes de caractères.