Что на самом деле происходит, когда я использую varchar (10) в командной строке sqlite? - PullRequest
1 голос
/ 23 апреля 2010

Я впервые возился с SQLite, работая над некоторыми документами по SQLite. В частности, я использую оболочку командной строки для SQLite и учебник SoupToNuts SQLite для Sourceforge.

В соответствии с документацией SQLite о типе данных в SQLite имеется только 5 типов данных. Тем не менее, в двух учебных документах выше я вижу, где авторы используют такие команды, как

create table tbl1(one varchar(10), two smallint);
create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);

, которые содержат типы данных, которые не перечислены в SQLite, но эти команды работают просто отлично.

Кроме того, когда я запускал .dump для просмотра операторов SQL, эти спецификации типов данных сохранялись:

sqlite> CREATE TABLE Vulnerabilities (
   ...> VulnerabilityID unsigned smallint primary key,
   ...> VulnerabilityName varchar(10),
   ...> VulnerabilityDescription longtext);
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE Vulnerabilities (
VulnerabilityID unsigned smallint primary key,
VulnerabilityName varchar(10),
VulnerabilityDescription longtext);
COMMIT;
sqlite>

Итак, что дает? Сохраняет ли SQLite ссылку для любого типа данных, указанного в SQL, и все же преобразует его за кулисами в один из 5 типов данных? Или я что-то пропустил?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2010

SQLite использует динамическую типизацию .
SQLite позволит вам вставить целое число в этот столбец VARCHAR (10).
SQLite не будет жаловаться, если вставить в него строку длиной более 10 символовколонка.

Как упоминает el.pescado, в SQLite есть классы хранения AKA "affinities".
Если вы попытаетесь вставить столбец, принадлежащий конкретному сродству , то SQLite попытается преобразовать этозначение, соответствующее сходству.
Если преобразование не работает, значение вставляется как есть.

Таким образом, в то время как ваши более детализированные типы данных сохраняются (очевидно) в таблице метаданных, они неиспользуется SQLite.

0 голосов
/ 23 апреля 2010

Существует не пять типов данных, а 5 "классов" типов данных, в которые попадают "настоящие" типы данных.Таким образом, TINYINT, SMALLINT и BIGINT - это три разных типа данных, но все они принадлежат к классу хранения INTEGER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...