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.

97

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 RDBMStraditionnels. 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:

  1. Oubliez Temporairement tout ce que vous saviez sur standalone datatypes de base de données

  2. Lisez le lien ci-dessus à partir du site SQLite.

  3. Prenez les types basés sur votre ancien schéma, et voyez à quoi ils correspondent SQLite

  4. 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.

92
répondu J. Polfer 2015-08-25 15:06:59

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:

46
répondu dan04 2010-05-04 00:08:03

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.

10
répondu Jay 2010-05-03 22:16:47

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é.

3
répondu user2393484 2013-05-17 10:44:18

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).

1
répondu eold 2015-09-11 21:44:57