Shrnutí :v tomto tutoriálu se dozvíte o systému datových typů SQLite a jeho souvisejících konceptech, jako jsou třídy úložiště, typování manifestu a typová afinita.
Úvod do datových typů SQLite
Pokud pocházíte z jiných databázových systémů, jako je MySQL a PostgreSQL, všimnete si, že používají statické psaní . To znamená, že když deklarujete sloupec se specifickým datovým typem, tento sloupec může ukládat pouze data deklarovaného datového typu.
Na rozdíl od jiných databázových systémů používá SQLite systém dynamického typu . Jinými slovy, hodnota uložená ve sloupci určuje jeho datový typ, nikoli datový typ sloupce.
Navíc při vytváření tabulky nemusíte deklarovat konkrétní datový typ pro sloupec. V případě, že deklarujete sloupec s datovým typem integer, můžete ukládat jakýkoli druh datových typů, jako je text a BLOB, SQLite si na to nebude stěžovat.
SQLite poskytuje pět primitivních datových typů, které se označují jako třídy úložiště.
Třídy úložiště popisují formáty, které SQLite používá k ukládání dat na disk. Třída úložiště je obecnější než datový typ, např. INTEGER
třída úložiště obsahuje 6 různých typů celých čísel. Ve většině případů můžete třídy úložiště a datové typy používat zaměnitelně.
Následující tabulka ilustruje 5 tříd úložiště v SQLite:
Třída úložiště | Význam |
---|---|
NULL | Hodnoty NULL znamenají chybějící informace nebo neznámé. |
INTEGER | Celočíselné hodnoty jsou celá čísla (buď kladná nebo záporná). Celé číslo může mít proměnnou velikost, například 1, 2, 3, 4 nebo 8 bajtů. |
SKUTEČNÉ | Skutečné hodnoty jsou reálná čísla s desetinnými hodnotami, které používají 8bajtové plovoucí znaky. |
TEXT | TEXT se používá k ukládání znakových dat. Maximální délka TEXTu je neomezená. SQLite podporuje různá kódování znaků. |
BLOB | BLOB znamená binární velký objekt, který může ukládat jakýkoli druh dat. Maximální velikost BLOB je teoreticky neomezená. |
SQLite určuje datový typ hodnoty na základě jejího datového typu podle následujících pravidel:
- Pokud literál neobsahuje žádné uvozovky a desetinnou čárku nebo exponent, SQLite přiřadí třídu úložiště INTEGER.
- Pokud je literál uzavřen do jednoduchých nebo dvojitých uvozovek, SQLite přiřadí třídu úložiště TEXT.
- Pokud literál nemá uvozovky, desetinnou čárku ani exponent, SQLite přiřadí třídu úložiště REAL.
- Pokud má literál hodnotu NULL bez uvozovek, je přiřazena třída úložiště NULL.
- Pokud má literál X’ABCD’ nebo x ‘abcd’, SQLite mu přiřadí třídu úložiště BLOB.
SQLite nepodporuje vestavěné třídy ukládání data a času. K uložení hodnot data a času však můžete použít TEXT, INT nebo REAL. Podrobné informace o tom, jak zacházet s hodnotami data a času, najdete v kurzu data a času SQLite.
SQLites poskytuje typeof()
funkce, která vám umožňuje zkontrolovat třídu úložiště hodnoty na základě jejího formátu. Viz následující příklad:
SELECT
typeof(100),
typeof(10.0),
typeof('100'),
typeof(x'1000'),
typeof(NULL);
Code language: SQL (Structured Query Language) (sql)
Jeden sloupec v SQLite může ukládat smíšené datové typy. Viz následující příklad.
Nejprve vytvořte novou tabulku s názvem test_datatypes
pro testování.
CREATE TABLE test_datatypes (
id INTEGER PRIMARY KEY,
val
);
Code language: SQL (Structured Query Language) (sql)
Za druhé vložte data do test_datatypes
tabulka.
INSERT INTO test_datatypes (val)
VALUES
(1),
(2),
(10.1),
(20.5),
('A'),
('B'),
(NULL),
(x'0010'),
(x'0011');
Code language: SQL (Structured Query Language) (sql)
Za třetí, použijte typeof()
funkce k získání datového typu každé hodnoty uložené v val
sloupec.
SELECT
id,
val,
typeof(val)
FROM
test_datatypes;
Code language: SQL (Structured Query Language) (sql)
Můžete se zeptat, jak SQLite třídí data ve sloupci s různými třídami úložiště, jako je sloupec val výše.
K vyřešení tohoto problému poskytuje SQLite následující sadu pravidel, pokud jde o řazení:
- Třída úložiště NULL má nejnižší hodnotu. Je nižší než jakékoli jiné hodnoty. Mezi hodnotami NULL není žádné pořadí.
- Další vyšší třídy úložiště jsou INTEGER a REAL. SQLite porovnává INTEGER a REAL numericky.
- Další vyšší třídou úložiště je TEXT. SQLite používá řazení hodnot TEXT, když porovnává hodnoty TEXT.
- Nejvyšší třídou úložiště je BLOB. SQLite používá C funkci
memcmp()
pro porovnání hodnot BLOB.
Když použijete ORDER BY
klauzule k řazení dat do sloupce s různými třídami úložiště, SQLite provede následující kroky:
- Nejprve seskupte hodnoty na základě třídy úložiště:NULL, INTEGER a REAL, TEXT a BLOB.
- Zadruhé seřaďte hodnoty v každé skupině.
Následující příkaz seřadí smíšená data v val
ve sloupci test_datatypes
tabulka:
SELECT
id,
val,
typeof(val)
FROM
test_datatypes
ORDER BY val;
Code language: SQL (Structured Query Language) (sql)
Typování manifestu SQLite a typová afinita
Dalšími důležitými koncepty souvisejícími s datovými typy SQLite jsou typování manifestu a typová afinita:
- Manifestní typ znamená, že datový typ je vlastností hodnoty uložené ve sloupci, nikoli vlastností sloupce, ve kterém je hodnota uložena. SQLite používá typování manifestu k ukládání hodnot libovolného typu do sloupce.
- Doporučený typ pro data uložená v tomto sloupci je typová příbuznost sloupce. Všimněte si, že datový typ je doporučený, není vyžadován, proto sloupec může ukládat jakýkoli typ dat.
V tomto tutoriálu jste se dozvěděli o datových typech SQLite a některých důležitých konceptech, včetně tříd úložiště, typování manifestu a příbuznosti typů.