Quelle est la différence entre les types de données SQLite connexes comme INT, INTEGER, SMALLINT et TINYINT?
Lors de la création d'une table dans SQLite3, je suis confus lorsqu'il est confronté à 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 integer, mais je n'ai aucune idée de ce que sont ces capacités.
5 réponses
SQLite
, techniquement, n'a pas de types de données, il y a des classes de stockage dans un système de typage de manifeste, et oui, c'est déroutant si vous êtes habitué aux RDBMS
traditionnels. Tout, en interne, est stocké sous forme de texte. Les types de données sont contraints/convertis en divers emplacements de stockage en fonction des affinités (types de données Ala affectés aux colonnes).
La meilleure chose que je vous recommande de faire est de:
-
Oubliez Temporairement tout ce que vous saviez sur standalone datatypes de base de données
Lisez le lien ci-dessus à partir du site
SQLite
.Prenez les types basés sur votre ancien schéma, et voyez à quoi ils correspondent
SQLite
Migrez toutes les données vers la base de données
SQLite
.
Remarque: les limitations de type de données peuvent être lourdes, surtout si vous ajoutez des durées, des dates ou des choses de cette nature dans SQL
. SQLite
a très peu de fonctions intégrées pour ce genre de chose. Cependant, SQLite
fournit un moyen facile pour vous de créer vos propres fonctions intégrées pour ajouter des durées de temps et des choses de cette nature, à travers le sqlite3_create_function
fonction bibliothèque. Vous utiliseriez cette installation à la place des procédures stockées traditionnelles.
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.
- int, INTEGER, SMALLINT, TINYINT → affinité entière, car ils contiennent tous "INT".
- LONGCHAR, LONGVARCHAR → affinité de texte, car ils contiennent "CHAR".
- DEC, DECIMAL, DATETIME, SMALLDATETIME → NUMERIC, car ils ne contiennent aucune des sous-chaînes qui comptent.
Les règles pour déterminer l'affinité sont il est possible de le faire sur le site Web de la société SQLite.
Si vous insistez sur le typage strict, vous pouvez l'implémenter avec des contraintes CHECK
:
CREATE TABLE T (
N INTEGER CHECK(TYPEOF(N) = 'integer'),
Str TEXT CHECK(TYPEOF(Str) = 'text'),
Dt DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);
Mais je ne m'en occupe jamais.
Quant à la capacité de chaque type:
- {[2] } est toujours signé 64 bits. Notez que SQLite optimise le stockage {[19] } de petits entiers dans les coulisses, donc TINYINT ne serait pas utile de toute façon.
-
REAL
est toujours 64 bits (double
). -
TEXT
etBLOB
ont un taille maximale déterminée par une macro de préprocesseur, qui par défaut est de 1 000 000 000 octets.
La plupart d'entre eux sont là pour la compatibilité. Vous avez vraiment seulement entier, flottant, texte et blob. Les Dates peuvent être stockées sous forme de nombre (unix time est entier, microsoft time est float) ou de texte.
NULL
. La valeur est une valeur NULL.
INTEGER
. La valeur est un entier signé, stockées dans 1, 2, 3, 4, 6, ou 8 octets en fonction de l'ampleur de la valeur.
REAL
. La valeur est une valeur à virgule flottante, stockée sous la forme d'un nombre à virgule flottante IEEE de 8 octets.
TEXT
. La valeur est une chaîne de texte, stockée à l'aide de l'encodage 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é.
Comme un complément à la réponse de dan04, si vous voulez aveuglément insérer un NUMERIC
, autre que zéro, représenté par un TEXT
, mais s'assurer que le texte est convertible numérique:
your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)
Le cas D'utilisation typique est dans une requête d'un programme qui traite toutes les données comme du texte (pour plus d'uniformité et de simplicité, puisque SQLite le fait déjà). La bonne chose à ce sujet est qu'il permet des constructions comme ceci:
INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)
Ce qui est pratique dans le cas où vous utilisez des espaces réservés parce que vous n'avez pas pour gérer ces champs numériques non nuls spécialement. Un exemple utilisant le module sqlite3
de Python serait,
conn_or_cursor.execute(
"INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",
str_value_tuple) # no need to convert some from str to int/float
Dans l'exemple ci-dessus, toutes les valeurs de str_value_tuple
seront échappées et citées en tant que chaînes lorsqu'elles seront transmises à SQlite. Cependant, puisque nous ne vérifions pas explicitement le type via TYPEOF
mais seulement convertibilité en type , cela fonctionnera toujours comme souhaité (C'est-à-dire que SQLite le stockera en tant que numérique ou échouera autrement).