Introduktion till datatyper i SQL

Till skillnad från JavaScript har SQL stark skrivning. I varje tabell har varje kolumn sin egen fasta datatyp.

Det finns många datatyper, men till skillnad från Java-språket finns det så många av dem inte eftersom det finns datatyper för alla tillfällen. Databaser är mycket beroende av storleken på data, så många datatyper skiljer sig från varandra endast i längd.

Totalt kan datatyper delas in i 5 grupper:

  • Numeriska typer
  • Strängtyper _
  • Typer för att lagra datum och tider
  • Objekt: representeras vanligtvis som en samling byte
  • Transport : JSON och XML

Vanligtvis har olika DBMS fortfarande sina egna datatyper. Varje DBMS har sin egen specialisering, så att lägga till nya datatyper är en mycket vanlig sak.

En annan sak är att det inte räcker med att bara lägga till en ny datatyp, du måste lägga till funktioner som fungerar med den, samt få detta att fungera bekvämt och snabbt.

Om du arbetar med någon industriell (företags) DBMS, kommer du troligen att behöva ta itu med dess datatyper och dess funktioner. För vad det kommer att vara nödvändigt att läsa 2-5 bra böcker.

Som en del av vår bekantskap med SQL kommer vi att överväga tre huvudgrupper av datatyper:

  • Tal
  • Strängar
  • Datum

Numeriska typer i SQL

I SQL är numeriska typer uppdelade i tre grupper:

  • Heltalstyper
  • Fasta punktnummer (fast antal decimaler)
  • Flyttal

Låt oss börja med heltal . Det finns bara 5 av dem, och de kan beskrivas i en tabell:

# Skriv namn Längd i byte Analog från Java Minsta värde Maximalt värde
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 lång -2 63 2 63-1

Datatyperna är väldigt lika Java-datatyperna, men det finns också en heltalstyp som är tre byte lång. Detta görs för att spara på storleken.

Därefter kommer flyttalstyperna , precis som i Java, det finns bara två av dem:

# Skriv namn Längd i byte Analog från Java Minsta värde Maximalt värde
1 FLYTA 4 flyta -3,40E+38 +1,18E+38
2 DUBBEL 8 dubbel -1,79E+308 +1,79E+308

Återigen, inget nytt. Allt är detsamma som i Java. Men till skillnad från Java har SQL en annan speciell typ, det reella talet med fast punkt. Det kallas DECIMAL.

Vanligtvis används denna typ för att lagra pengar. När namnet på denna typ skrivs, så brukar det efter det anges hur många decimaler talet har före och efter decimalkomma. Det allmänna formatet ser ut så här:

DECIMAL(total_characters, after_comma)

Och ett litet exempel:

salary DECIMAL(5,2)

Så här beskrev vi det faktum att lönekolumnen kan innehålla heltal (max 3 decimaler) och en bråkdel - 2 decimaler.

Det maximala antalet tecken som DECIMAL-typen stöder är 65.

Strängtyper i SQL

Rader i en databas kan lagras i två former:

  • Snören med fast längd
  • Strängar med variabel längd

Strängar med fast längd anges som CHAR :

CHAR(length)

Fast längd innebär att alla värden i denna kolumn kommer att innehålla ett strikt fast antal tecken.

Ett exempel på en sträng med fast längd:

country_code CHAR(2)

Strängar med variabel längd specificeras av VARCHAR -typen :

VARCHAR(max_length)

Variabel längd innebär att alla värden i denna kolumn kommer att innehålla text av valfri längd, men inte mer än den maximala längden.

Exempel på sträng med variabel längd:

phone VARCHAR(12)

Snören med fast längd har en mycket stor fördel. Om klienten bad SQL-servern att returnera den 1 000 000:e raden från tabellen till honom och raderna i tabellen är av fast längd, kan du, när du känner till radens längd, enkelt beräkna de byte som hänför sig till den önskade rad.

I fallet med en variabel längd på rader kommer det inte att vara möjligt att snabbt hitta önskad rad i tabellen. Kom ihåg hastigheten för åtkomst till ArrayList och LinkedList, situationen är ungefär densamma här.

Låt oss jämföra hur strängar av olika längd kommer att lagras i en tabell, beroende på datatyp.

Linje CHAR(4) Byte att lagra VARCHAR(4) Byte att lagra
'' ' ' 4 '' 1
'ab' 'ab' 4 'ab' 3
'abcd' 'abcd' 4 'abcd' 5
'abcdefgh' 'abcd' 4 'abcd' 5

Notera. VARCHAR-typen kräver ytterligare en byte för samma längd, eftersom den dessutom måste lagra längden på strängen.

Tillfälliga typer i SQL

SQL har även speciella typer för att lagra datum och tider. Det finns fem typer totalt:

# Skriv namn Analog från Java DateTime API Exempel Minsta värde Maximalt värde
1 DATUM LocalDate "2022-06-30" '1000-01-01' '9999-12-31'
2 TID Lokal tid 'hh:mm:ss[.fraktion]' '-838:59:59.000000' '838:59:59.000000'
3 DATUM TID LocalDateTime '1000-01-01 00:00:00.000000' '9999-12-31 23:59:59.999999'
4 TIDSSTÄMPEL Datum '1970-01-01 00:00:01.000000' '2038-01-19 03:14:07.999999'
5 ÅR 1901 2155

All data i frågor skrivs som en sträng - i enkla citattecken. Inmatningsformatet går från största till minsta:

  • År
  • Månad
  • Dag
  • Timme
  • Minut
  • Andra
  • Bråkdelar av en sekund

Typerna DATE, TIME och DATETIME kan konventionellt betraktas som analoger av typerna från Java DateTme API: LocalDate, LocalTime, LocalDateTime. Logiken är ungefär densamma.

Typen TIMESTAMP lagrar data i millisekunder sedan början av 1970 (en UNIX-operativsystemstandard). Det är i den här formen som de lagras av datumtypen i Java-språket.

Och slutligen finns det YEAR-typen, som är 1 byte lång och lagrar värden från 1 till 255. Därför är det tillgängliga årsintervallet 1901-2155. Årtalet 1900 kan inte lagras av denna typ, eftersom värdet 0 används för att koda ett NULL-värde.

Lagra objekt i SQL

Det finns speciella typer för förvaring av föremål eller texter av stor längd. Vi kommer inte att gå in i detalj på dem, men jag listar dem ändå:

# Skriv namn Förklaring
1 TEXT Används för att lagra långa texter. Vid jämförelse och sortering på detta fält används endast de första 100 tecknen.
2 KLICK Namnet står för Byte Large Object. Lagras som bara en samling byte. Kan användas för att till exempel lagra bilder i en databas.
3 CLOB Namnet står för Char Large Object. Används för att lagra långa texter.
4 ENUM Låter dig ställa in en fast uppsättning värden och lagra ett av dem som ett värde.
5 UPPSÄTTNING Låter dig ställa in en fast uppsättning värden och lagra alla delmängder av dem som ett värde. Lagrar dem vanligtvis som en binär mask.

Teoretiskt sett kan du serialisera vilket Java-objekt som helst som en uppsättning byte och lagra det i databasen som en BLOB. Att spara objektet är inget problem. Hur ska man jobba vidare med honom?

Låt oss säga att ett bord lagrar en miljon objekt i serieformat - hur ska du söka igenom dem? En DBMS stöder endast en viss typ av data när den tillhandahåller en omfattande uppsättning funktioner för att arbeta med den.