Introduktion til datatyper i SQL
I modsætning til JavaScript har SQL stærk indtastning. I hver tabel har hver kolonne sin egen faste datatype.
Der er mange datatyper, men i modsætning til Java-sproget er der så mange af dem ikke, fordi der er datatyper til alle lejligheder. Databaser er meget afhængige af størrelsen af dataene, så mange datatyper adskiller sig kun fra hinanden i længden.
I alt kan datatyper opdeles i 5 grupper:
- Numeriske typer
- Strengetyper _
- Typer til lagring af datoer og tidspunkter
- Objekter: normalt repræsenteret som en samling af bytes
- Transport : JSON og XML
Normalt har forskellige DBMS stadig deres egne datatyper. Hvert DBMS har sin egen specialisering, så det er meget almindeligt at tilføje nye datatyper.
En anden ting er, at det ikke er nok at tilføje en ny datatype, du skal tilføje funktioner, der fungerer sammen med den, samt få dette til at arbejde bekvemt og hurtigt.
Hvis du arbejder på en industriel (enterprise) DBMS, vil du højst sandsynligt have at gøre med dens datatyper og dens funktioner. For hvad det vil være nødvendigt at læse 2-5 gode bøger.
Som en del af vores kendskab til SQL vil vi overveje tre hovedgrupper af datatyper:
- Tal
- Strenge
- Datoer
Numeriske typer i SQL
I SQL er numeriske typer opdelt i tre grupper:
- Heltalstyper
- Faste punkttal (fast antal decimaler)
- Flydende kommatal
Lad os starte med heltal . Der er kun 5 af dem, og de kan beskrives i én tabel:
# | Indtast navn | Længde i bytes | Analog fra Java | Minimumsværdi | Maksimal værdi |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | SMALLINT | 2 | kort | -32.768 | 32.767 |
3 | MEDIUMINT | 3 | -8.388.608 | 8.388.607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | STORT | 8 | lang | -2 63 | 2 63-1 |
Datatyperne minder meget om Java-datatyperne, men der er også en heltalstype, der er tre byte lang. Dette gøres for at spare på størrelsen.
Dernæst kommer typerne med flydende komma , ligesom i Java, der er kun to af dem:
# | Indtast navn | Længde i bytes | Analog fra Java | Minimumsværdi | Maksimal værdi |
---|---|---|---|---|---|
1 | FLYDE | 4 | flyde | -3,40E+38 | +1,18E+38 |
2 | DOBBELT | 8 | dobbelt | -1,79E+308 | +1,79E+308 |
Igen, intet nyt. Alt er det samme som i Java. Men i modsætning til Java har SQL en anden speciel type, det faste reelle tal. Det hedder DECIMAL.
Typisk bruges denne type til at opbevare pengebeløb. Når navnet på denne type skrives, så angives det normalt efter det, hvor mange decimaler tallet har før og efter decimaltegnet. Det generelle format ser således ud:
DECIMAL(total_characters, after_comma)
Og et lille eksempel:
salary DECIMAL(5,2)
Sådan beskrev vi det faktum, at lønkolonnen kan indeholde heltal (maks. 3 decimaler) og en brøkdel - 2 decimaler.
Det maksimale antal tegn, som DECIMAL-typen understøtter, er 65.
Strengtyper i SQL
Rækker i en database kan gemmes i to former:
- Fast længde strenge
- Strenge med variabel længde
Fast-længde strenge er specificeret som CHAR :
CHAR(length)
Fast længde betyder, at alle værdier i denne kolonne vil indeholde et strengt fastsat antal tegn.
Et eksempel på en streng med fast længde:
country_code CHAR(2)
Strenge med variabel længde er specificeret af VARCHAR -typen :
VARCHAR(max_length)
Variabel længde betyder, at alle værdier i denne kolonne vil indeholde tekst af enhver længde, men ikke mere end den maksimale længde.
Eksempel på streng med variabel længde:
phone VARCHAR(12)
Fast længde strenge har en meget stor fordel. Hvis klienten bad SQL-serveren om at returnere den 1.000.000. række fra tabellen til ham, og rækkerne i tabellen er af fast længde, så kan du, ved at kende længden af rækken, nemt beregne de bytes, der vedrører den ønskede række.
Ved variabel længde af linjer vil det ikke være muligt hurtigt at finde den ønskede række i tabellen. Husk adgangshastigheden til ArrayList og LinkedList, situationen er omtrent den samme her.
Lad os sammenligne, hvordan strenge af forskellig længde bliver gemt i en tabel, afhængigt af datatypen.
Linje | CHAR(4) | Byte at gemme | VARCHAR(4) | Byte at gemme | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
'abcdefgh' | 'abcd' | 4 | 'abcd' | 5 |
Bemærk. VARCHAR-typen kræver en byte mere for samme længde, fordi den yderligere skal gemme længden af strengen.
Midlertidige typer i SQL
SQL har også specielle typer til lagring af datoer og tidspunkter. Der er fem typer i alt:
# | Indtast navn | Analog fra Java DateTime API | Eksempel | Minimumsværdi | Maksimal værdi |
---|---|---|---|---|---|
1 | DATO | LocalDate | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | TID | Lokal tid | 'tt:mm:ss[.brøk]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATO TID | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | TIDSSTEMPEL | Dato | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | ÅR | 1901 | 2155 |
Alle data i forespørgsler skrives som en streng - i enkelte anførselstegn. Indtastningsformatet går fra største til mindste:
- År
- Måned
- Dag
- Time
- Minut
- Anden
- Brøkdele af et sekund
DATE, TIME og DATETIME typerne kan traditionelt betragtes som analoger af typerne fra Java DateTme API: LocalDate, LocalTime, LocalDateTime. Logikken er omtrent den samme.
TIMESTAMP-typen gemmer data i millisekunder siden begyndelsen af 1970 (en UNIX-operativsystemstandard). Det er i denne form, de gemmes af datotypen i Java-sproget.
Og endelig er der typen ÅR, som er 1 byte lang og gemmer værdier fra 1 til 255. Derfor er den tilgængelige årrække 1901-2155. Året 1900 kan ikke gemmes af denne type, da værdien 0 bruges til at kode en NULL-værdi.
Lagring af objekter i SQL
Der er specielle typer til opbevaring af genstande eller tekster af stor længde. Vi vil ikke gå i detaljer om dem, men jeg vil liste dem alligevel:
# | Indtast navn | Forklaring |
---|---|---|
1 | TEKST | Bruges til at gemme lange tekster. Ved sammenligning og sortering på dette felt bruges kun de første 100 tegn. |
2 | BLOB | Navnet står for Byte Large Object. Gemt som blot en samling af bytes. Kan bruges til fx at gemme billeder i en database. |
3 | KLUB | Navnet står for Char Large Object. Bruges til at gemme lange tekster. |
4 | ENUM | Giver dig mulighed for at indstille et fast sæt værdier og gemme en af dem som en værdi. |
5 | SÆT | Giver dig mulighed for at indstille et fast sæt værdier og gemme enhver delmængde af dem som en værdi. Normalt gemmer dem som en binær maske. |
Teoretisk set kan du serialisere ethvert Java-objekt som et sæt bytes og gemme det i databasen som en BLOB. Det er ikke et problem at gemme objektet. Hvordan arbejder man videre med ham?
Lad os sige, at et bord gemmer en million objekter i serieform - hvordan vil du søge gennem dem? Et DBMS understøtter kun en bestemt type data, når det giver et omfattende sæt funktioner til at arbejde med det.