Introduksjon til datatyper i SQL
I motsetning til JavaScript har SQL sterk skriving. I hver tabell har hver kolonne sin egen faste datatype.
Det er mange datatyper, men i motsetning til Java-språket er det så mange av dem ikke fordi det finnes datatyper for alle anledninger. Databaser er veldig avhengige av størrelsen på dataene, så mange datatyper skiller seg fra hverandre kun i lengde.
Totalt kan datatyper deles inn i 5 grupper:
- Numeriske typer
- Strengetyper _
- Typer for lagring av datoer og klokkeslett
- Objekter: vanligvis representert som en samling byte
- Transport : JSON og XML
Vanligvis har forskjellige DBMS fortsatt sine egne datatyper. Hver DBMS har sin egen spesialisering, så å legge til nye datatyper er en veldig vanlig ting.
En annen ting er at det ikke er nok å bare legge til en ny datatype, du må legge til funksjoner som fungerer med den, samt få dette til å fungere praktisk og raskt.
Hvis du jobber med en industriell (enterprise) DBMS, må du mest sannsynlig forholde deg til datatypene og funksjonene. For hva det vil være nødvendig å lese 2-5 gode bøker.
Som en del av vår kjennskap til SQL vil vi vurdere tre hovedgrupper av datatyper:
- Tall
- Strenger
- Datoer
Numeriske typer i SQL
I SQL er numeriske typer delt inn i tre grupper:
- Heltallstyper
- Faste punkttall (fast antall desimaler)
- Flytende kommatall
La oss starte med heltall . Det er bare 5 av dem, og de kan beskrives i én tabell:
# | Skriv inn navn | Lengde i byte | Analog fra Java | Minimumsverdi | Maksimal verdi |
---|---|---|---|---|---|
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 |
Datatypene ligner veldig på Java-datatypene, men det finnes også en heltallstype som er tre byte lang. Dette gjøres for å spare på størrelsen.
Deretter kommer flytepunkttypene , akkurat som i Java, det er bare to av dem:
# | Skriv inn navn | Lengde i byte | Analog fra Java | Minimumsverdi | Maksimal verdi |
---|---|---|---|---|---|
1 | FLYTE | 4 | flyte | -3,40E+38 | +1,18E+38 |
2 | DOBBELT | 8 | dobbelt | -1,79E+308 | +1,79E+308 |
Igjen, ikke noe nytt. Alt er det samme som i Java. Men i motsetning til Java har SQL en annen spesiell type, det reelle tallet med fast punkt. Det kalles DESIMAL.
Vanligvis brukes denne typen til å lagre pengebeløp. Når navnet på denne typen skrives, blir det vanligvis angitt etter det hvor mange desimaler tallet har før og etter desimaltegn. Det generelle formatet ser slik ut:
DECIMAL(total_characters, after_comma)
Og et lite eksempel:
salary DECIMAL(5,2)
Slik beskrev vi det faktum at lønnskolonnen kan inneholde heltall (maks 3 desimaler) og en brøkdel - 2 desimaler.
Maksimalt antall tegn som DECIMAL-typen støtter er 65.
Strengtyper i SQL
Rader i en database kan lagres i to former:
- Fast lengde strenger
- Strenger med variabel lengde
Fast-lengde strenger er spesifisert som CHAR :
CHAR(length)
Fast lengde betyr at alle verdiene i denne kolonnen vil inneholde et strengt fastsatt antall tegn.
Et eksempel på en streng med fast lengde:
country_code CHAR(2)
Strenger med variabel lengde er spesifisert av VARCHAR -typen :
VARCHAR(max_length)
Variabel lengde betyr at alle verdiene i denne kolonnen vil inneholde tekst uansett lengde, men ikke mer enn maksimal lengde.
Eksempel på streng med variabel lengde:
phone VARCHAR(12)
Fast lengde strenger har en veldig stor fordel. Hvis klienten spurte SQL-serveren om å returnere den 1.000.000. raden fra tabellen, og radene i tabellen har fast lengde, kan du, når du kjenner lengden på raden, enkelt beregne bytene som er relatert til ønsket rad.
Ved variabel lengde på linjer vil det ikke være mulig å raskt finne ønsket rad i tabellen. Husk tilgangshastigheten til ArrayList og LinkedList, situasjonen er omtrent den samme her.
La oss sammenligne hvordan strenger av forskjellig lengde vil bli lagret i en tabell, avhengig av datatypen.
Linje | CHAR(4) | Byte å lagre | VARCHAR(4) | Byte å lagre | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
'abcdefgh' | 'abcd' | 4 | 'abcd' | 5 |
Merk. VARCHAR-typen krever en byte til for samme lengde, fordi den i tillegg må lagre lengden på strengen.
Midlertidige typer i SQL
SQL har også spesielle typer for lagring av datoer og klokkeslett. Det er fem typer totalt:
# | Skriv inn navn | Analog fra Java DateTime API | Eksempel | Minimumsverdi | Maksimal verdi |
---|---|---|---|---|---|
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 | TIDSSTIMPEL | Dato | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | ÅR | 1901 | 2155 |
Alle data i spørringer skrives som en streng - i enkle anførselstegn. Oppføringsformatet går fra størst til minste:
- År
- Måned
- Dag
- Time
- Minutt
- Sekund
- Brøkdeler av et sekund
DATE, TIME og DATETIME-typene kan konvensjonelt betraktes som analoger av typene fra Java DateTme API: LocalDate, LocalTime, LocalDateTime. Logikken er omtrent den samme.
TIMESTAMP-typen lagrer data i millisekunder siden begynnelsen av 1970 (en UNIX-operativsystemstandard). Det er i denne formen de lagres av datotypen i Java-språket.
Og til slutt er det YEAR-typen, som er 1 byte lang og lagrer verdier fra 1 til 255. Derfor er rekkevidden av år tilgjengelig for den 1901-2155. Året 1900 kan ikke lagres av denne typen, siden verdien 0 brukes til å kode en NULL-verdi.
Lagre objekter i SQL
Det finnes spesielle typer for oppbevaring av gjenstander eller tekster av stor lengde. Vi vil ikke gå i detalj på dem, men jeg vil liste dem likevel:
# | Skriv inn navn | Forklaring |
---|---|---|
1 | TEKST | Brukes til å lagre lange tekster. Ved sammenligning og sortering på dette feltet brukes kun de første 100 tegnene. |
2 | BLOB | Navnet står for Byte Large Object. Lagret som bare en samling byte. Kan brukes til for eksempel å lagre bilder i en database. |
3 | CLOB | Navnet står for Char Large Object. Brukes til å lagre lange tekster. |
4 | ENUM | Lar deg angi et fast sett med verdier og lagre en av dem som en verdi. |
5 | SETT | Lar deg angi et fast sett med verdier og lagre ethvert delsett av dem som en verdi. Lagrer dem vanligvis som en binær maske. |
Teoretisk sett kan du serialisere et hvilket som helst Java-objekt som et sett med byte og lagre det i databasen som en BLOB. Å lagre objektet er ikke noe problem. Hvordan jobbe videre med ham?
La oss si at et bord lagrer en million objekter i seriell form – hvordan vil du søke gjennom dem? Et DBMS støtter bare en bestemt type data når det gir et omfattende sett med funksjoner for å jobbe med det.