Data types in SQLite#
%LOAD ../data/employees.db
De datatypes in SQLite zijn eenvoudiger dan die in andere SQL-database-systemen (zie Data types in MySQL). Waar je in MySQL de (maximale) grootte op kunt geven van getallen of van tekst-waarden, gebruikt SQLite een flexibele maar efficiënte manier om de gegevens (compact) op te slaan. SQLite heeft de volgende datatypes:
INTEGER
REAL
TEXT
BLOB
NULL
SQLite heeft geen datum/tijd-type: voor datum-gegevens gebruik je tekst-waarden of getallen. (Zie: Datumfuncties in MySQL.)
Voor een uitgebreide beschrijving van SQLite datatypes, zie: https://www.sqlite.org/datatype3.html
Getallen: INTEGER en REAL#
Er zijn twee soorten numerieke gegevens:
gehele getallen (
INTEGER
ofINT
) - afhankelijk van de waarde, 0, 1, 2, 3, 4, 6, of 8 bytes“zwevende punt” (floating point) getallen (
REAL
) - 8 bytes “double” IEEE
Let op dat (zoals in de meestel computerprogramma’s) een punt gebruikt wordt waar in Nederland een komma gebruikelijk is (“zwevende komma”) - dus 3.1415926 in plaats van 3,1415926.
Alfanumeriek: TEXT#
Er is maar één type voor alfanumerieke gegevens: TEXT
.
Dit heeft een variabele lengte, maximaal ca. 1-2 GByte, afhankelijk van de implementatie.
BLOB#
Een BLOB is een Binary Large OBject, een reeks bytes van variabele lengte. Dit gebruik je bijvoorbeeld voor het opslaan van plaatjes of geluidsbestanden. De maximale lengte van een BLOB is net als die van TEXT, ca. 1-2 GByte, afhankelijk van de implementatie.
CAST: type-conversie#
In principe zet SQL een getal automatisch (impliciet) om naar een TEXT-waarde, als er mee gerekend wordt; of omgekeerd, van getal naar TEXT, als er een TEXT-operatie op uitgevoerd wordt.
Maar het is beter om deze omzetting altijd duidelijk (expliciet) aan te geven, met behulp van de CAST
constructie.
syntax:
CAST(expression AS type-name)
voorbeeld:
CAST(salary AS TEXT)
In het voorbeeld hieronder gebeurt een impliciete omzetting van TEXT naar INT, zoals je ziet aan het type van de bonus
kolom:
SELECT last_name, typeof(bonus), bonus, bonus + 100
FROM employees
WHERE bonus IS NOT NULL;
last_name | typeof(bonus) | bonus | bonus + 100 |
---|---|---|---|
Zlotkey | text | 1500 | 1600 |
Abel | text | 1700 | 1800 |
Taylor | text | 1250 | 1350 |
Het is beter om de omzetting (conversie) expliciet te maken:
SELECT last_name, typeof(bonus), bonus, CAST(bonus as INT) + 100
FROM employees
WHERE bonus IS NOT NULL;
last_name | typeof(bonus) | bonus | CAST(bonus as INT) + 100 |
---|---|---|---|
Zlotkey | text | 1500 | 1600 |
Abel | text | 1700 | 1800 |
Taylor | text | 1250 | 1350 |
Let op: in SQLite resulteert het afronden van een REAL in een afgeronde REAL waarde, niet in een INT waarde.
SELECT round(3.14);
round(3.14) |
---|
3.0 |
SELECT CAST(round(3.14) AS INT);
CAST(round(3.14) AS INT) |
---|
3 |
format
functie: NUMBER naar TEXT#
Voor het omzetten van een getal (INT of REAL) naar TEXT-formaat kun je in SQLite de format
functie gebruiken.
Deze heet ook wel printf
, en werkt als de C-functie printf
:
de eerste parameter is een format-string; hierin geef je aan op welke positie het getal ingevuld moet worden, en in welke notatie (bijvoorbeeld: aantal cijfers na de decimale punt).
je kunt allerlei tekst rond het getal plaatsen; bijvoorbeeld een
$
-teken voor een bedrag.de volgende parameter is het getal dat in de format-string ingevuld moet worden.
je kunt ook andere waarden dan getallen invullen (TEXT bijvoorbeeld); en je kunt meerdere waarden invullen in de format-string.
voor een uitgebreide beschrijving, zie: https://www.sqlite.org/draft/printf.html
Voorbeeld:
format('$ %d', round(3.5))
(d: geheel getal in decimale notatieformat('pi = %.3f', 3.1415926)
(f: floating point notatie, 3 cijfers na de.
)
SELECT format('$ %d',123) as bedrag;
bedrag |
---|
$ 123 |
SELECT format('pi = %.3f', 3.1415926) as PI;
PI |
---|
pi = 3.142 |
Merk op dat in dit laatste geval het getal afgerond wordt.
Geen CONVERT#
SQLite heeft geen CONVERT
-functie zoals MySQL. Je kunt het gewenste resultaat krijgen met behulp van CAST
.