Oversigt :i dette selvstudium lærer du om SQLite datatypesystem og dets relaterede begreber såsom lagerklasser, manifestskrivning og typetilhørsforhold.
Introduktion til SQLite-datatyper
Hvis du kommer fra andre databasesystemer såsom MySQL og PostgreSQL, bemærker du, at de bruger statisk indtastning . Det betyder, at når du erklærer en kolonne med en specifik datatype, kan den kolonne kun gemme data af den erklærede datatype.
Til forskel fra andre databasesystemer bruger SQLite dynamisk typesystem . Med andre ord, en værdi gemt i en kolonne bestemmer dens datatype, ikke kolonnens datatype.
Derudover behøver du ikke at angive en bestemt datatype for en kolonne, når du opretter en tabel. I tilfælde af at du erklærer en kolonne med heltalsdatatypen, kan du gemme enhver form for datatyper såsom tekst og BLOB, SQLite vil ikke klage over dette.
SQLite giver fem primitive datatyper, der omtales som lagerklasser.
Lagerklasser beskriver de formater, som SQLite bruger til at gemme data på disken. En lagerklasse er mere generel end en datatype, f.eks. INTEGER
lagerklasse omfatter 6 forskellige typer heltal. I de fleste tilfælde kan du bruge lagerklasser og datatyper i flæng.
Følgende tabel illustrerer 5 lagerklasser i SQLite:
Opbevaringsklasse | Betydning |
---|---|
NULL | NULL-værdier betyder manglende information eller ukendt. |
INTEGER | Heltalsværdier er hele tal (enten positive eller negative). Et heltal kan have variable størrelser såsom 1, 2, 3, 4 eller 8 bytes. |
RIGTIG | Reelle værdier er reelle tal med decimalværdier, der bruger 8-byte float. |
TEKST | TEXT bruges til at gemme tegndata. Den maksimale længde af TEXT er ubegrænset. SQLite understøtter forskellige tegnkodninger. |
BLOB | BLOB står for et binært stort objekt, der kan lagre enhver form for data. Den maksimale størrelse af BLOB er teoretisk set ubegrænset. |
SQLite bestemmer datatypen for en værdi baseret på dens datatype i henhold til følgende regler:
- Hvis en literal ikke har nogen omsluttende anførselstegn og decimaltegn eller eksponent, tildeler SQLite lagringsklassen INTEGER.
- Hvis et bogstav er omgivet af enkelte eller dobbelte anførselstegn, tildeler SQLite lagringsklassen TEXT.
- Hvis en literal ikke har anførselstegn, decimaltegn eller eksponent, tildeler SQLite REAL lagerklasse.
- Hvis en literal er NULL uden anførselstegn, tildeles den NULL-lagerklasse.
- Hvis en literal har X'ABCD' eller x 'abcd', tildelte SQLite BLOB-lagerklasse.
SQLite understøtter ikke indbyggede dato- og tidslagringsklasser. Du kan dog bruge TEXT, INT eller REAL til at gemme dato- og tidsværdier. For detaljerede oplysninger om, hvordan du håndterer dato- og klokkeslætsværdier, kan du se SQLite-selvstudiet om dato og klokkeslæt.
SQLites leverer typeof()
funktion, der giver dig mulighed for at kontrollere lagerklassen for en værdi baseret på dens format. Se følgende eksempel:
SELECT
typeof(100),
typeof(10.0),
typeof('100'),
typeof(x'1000'),
typeof(NULL);
Code language: SQL (Structured Query Language) (sql)
En enkelt kolonne i SQLite kan gemme blandede datatyper. Se følgende eksempel.
Først skal du oprette en ny tabel med navnet test_datatypes
til test.
CREATE TABLE test_datatypes (
id INTEGER PRIMARY KEY,
val
);
Code language: SQL (Structured Query Language) (sql)
For det andet, indsæt data i test_datatypes
tabel.
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)
For det tredje skal du bruge typeof()
funktion for at få datatypen for hver værdi gemt i val
kolonne.
SELECT
id,
val,
typeof(val)
FROM
test_datatypes;
Code language: SQL (Structured Query Language) (sql)
Du kan spørge, hvordan SQLite sorterer data i en kolonne med forskellige lagerklasser som f.eks. val-kolonnen ovenfor.
For at løse dette giver SQLite følgende sæt regler, når det kommer til sortering:
- NULL-lagerklassen har den laveste værdi. Det er lavere end nogen anden værdi. Mellem NULL-værdier er der ingen rækkefølge.
- De næste højere lagerklasser er INTEGER og REAL. SQLite sammenligner INTEGER og REAL numerisk.
- Den næste højere lagerklasse er TEXT. SQLite bruger sammenstillingen af TEXT-værdier, når den sammenligner TEXT-værdierne.
- Den højeste lagerklasse er BLOB. SQLite bruger C-funktionen
memcmp()
for at sammenligne BLOB-værdier.
Når du bruger ORDER BY
klausul for at sortere dataene i en kolonne med forskellige lagerklasser, udfører SQLite følgende trin:
- Gruppér først værdier baseret på lagerklasse:NULL, INTEGER og REAL, TEXT og BLOB.
- For det andet skal du sortere værdierne i hver gruppe.
Følgende sætning sorterer de blandede data i val
kolonne i test_datatypes
tabel:
SELECT
id,
val,
typeof(val)
FROM
test_datatypes
ORDER BY val;
Code language: SQL (Structured Query Language) (sql)
SQLite-manifestskrivning og typetilhørsforhold
Andre vigtige begreber relateret til SQLite datatyper er manifest typing og type affinitet:
- Manifestskrivning betyder, at en datatype er en egenskab for en værdi, der er gemt i en kolonne, ikke egenskaben for den kolonne, hvor værdien er gemt. SQLite bruger manifestskrivning til at gemme værdier af enhver type i en kolonne.
- Typeaffinitet for en kolonne er den anbefalede type for data, der er gemt i den kolonne. Bemærk, at datatypen anbefales, ikke påkrævet, derfor kan en kolonne gemme enhver type data.
I dette selvstudie har du lært om SQLite-datatyper og nogle vigtige begreber, herunder lagerklasser, manifestskrivning og typetilhørsforhold.