Lors de la création d'une table dans SQLite3, je suis confus face à tous les types de données possibles qui impliquent un contenu similaire, alors quelqu'un pourrait-il me dire la différence entre les types de données suivants?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Y a-t-il une documentation quelque part qui répertorie le min./max. capacités des différents types de données? Par exemple, je suppose que smallint
détient une valeur maximale plus grande que tinyint
, mais une valeur plus petite que l'entier, mais je n'ai aucune idée de ce que sont ces capacités.
DATE
ouBOOLEAN
, mais je ne prendrais pas la peine de faire la distinction entre différentes tailles d'entiers. Cela est particulièrement vrai pour le cas deINTEGER PRIMARY KEY
, le seul cas où le nom de type exact compte.La différence est le sucre syntaxique. Seules quelques sous-chaînes des noms de types importent en ce qui concerne l'affinité de type.
Les règles de détermination de l'affinité sont répertoriées sur le site SQLite .
Si vous insistez sur un typage strict, vous pouvez l'implémenter avec des
CHECK
contraintes:Mais je ne m'en soucie jamais.
Quant à la capacité de chaque type:
INTEGER
est toujours signé 64 bits. Notez que SQLite optimise le stockage des petits entiers en arrière-plan, donc TINYINT ne serait pas utile de toute façon.REAL
est toujours 64 bits (double
).TEXT
etBLOB
avoir une taille maximale déterminée par une macro de préprocesseur, qui est par défaut de 1 000 000 000 octets.la source
TYPEOF
. Ainsi, les tentatives pour insérer un TEXTE qui serait autrement converti en classe de stockage NUMERIC / INTEGER par SQlite (c'est-à-dire, une telle conversion est sans perte selon sqlite.org/datatype3.html#affinity ) échoueraient. En d'autres termes, cette approche est plus stricte que l'approche ad hoc d'insertion de la valeur, puis de validation magique de la classe de stockage utilisée pour stocker cette valeur par SQLite. Pour une approche plus permissive, voir ma réponse ci-dessous.La plupart de ceux-ci sont là pour la compatibilité. Vous n'avez vraiment que des entiers, des flottants, du texte et des blob. Les dates peuvent être stockées sous forme de nombre (l'heure unix est un entier, l'heure Microsoft est un flottant) ou sous forme de texte.
la source
NULL
. La valeur est une valeur NULL.INTEGER
. La valeur est un entier signé, stocké sur 1, 2, 3, 4, 6 ou 8 octets en fonction de l'amplitude de la valeur.REAL
. La valeur est une valeur à virgule flottante, stockée sous forme de nombre à virgule flottante IEEE de 8 octets.TEXT
. La valeur est une chaîne de texte, stockée à l'aide du codage de la base de données (UTF-8, UTF-16BE ou UTF-16LE).BLOB
. La valeur est un blob de données, stocké exactement comme il a été entré.la source
En complément de la réponse de dan04, si vous souhaitez insérer aveuglément un
NUMERIC
autre que zéro représenté par unTEXT
mais assurez-vous que le texte est convertible en numérique:Le cas d'utilisation typique est dans une requête d'un programme qui traite toutes les données comme du texte (pour l'uniformité et la simplicité, puisque SQLite le fait déjà). La bonne chose à ce sujet est que cela permet des constructions comme celle-ci:
ce qui est pratique dans le cas où vous utilisez des espaces réservés car vous n'avez pas à gérer spécialement ces champs numériques non nuls. Un exemple utilisant le
sqlite3
module de Python serait,Dans l'exemple ci-dessus, toutes les valeurs de
str_value_tuple
seront échappées et placées entre guillemets sous forme de chaînes lorsqu'elles sont transmises à SQlite. Cependant, comme nous ne vérifions pas explicitement le type viaTYPEOF
mais uniquement la convertibilité en type , cela fonctionnera toujours comme vous le souhaitez (c'est-à-dire que SQLite le stockera sous forme numérique ou échouera dans le cas contraire).la source