Bevezetés az SQL adattípusaiba

A JavaScript-től eltérően az SQL-ben erős a gépelés. Minden táblázatban minden oszlopnak megvan a maga rögzített adattípusa.

Nagyon sok adattípus létezik, de a Java nyelvvel ellentétben nem azért van belőlük sok, mert minden alkalomra vannak adattípusok. Az adatbázisok nagymértékben függenek az adatok méretétől, ezért sok adattípus csak hosszában tér el egymástól.

Összességében az adattípusok 5 csoportra oszthatók:

  • Numerikus típusok
  • String típusok
  • Dátumok és időpontok tárolására szolgáló típusok
  • Objektumok: általában bájtok gyűjteményeként jelennek meg
  • Szállítás : JSON és XML

Általában a különböző DBMS-eknek továbbra is megvannak a saját adattípusai. Minden DBMS-nek megvan a maga specializációja, így az új adattípusok hozzáadása nagyon gyakori dolog.

A másik dolog az, hogy nem elég egy új adattípus hozzáadása, hozzá kell adni olyan funkciókat, amelyek működni fognak vele, valamint kényelmessé és gyorssá kell tenni ezt a munkát.

Ha bármilyen ipari (vállalati) DBMS-en dolgozik, akkor valószínűleg foglalkoznia kell az adattípusokkal és a funkcióival. Mire lesz szükség 2-5 jó könyv elolvasására.

Az SQL-lel való ismerkedésünk részeként az adattípusok három fő csoportját fogjuk figyelembe venni:

  • Számok
  • Húrok
  • Dátumok

Numerikus típusok az SQL-ben

Az SQL-ben a numerikus típusokat három csoportra osztják:

  • Egész típusok
  • Rögzített pontszámok (fix számú tizedesjegy)
  • Lebegőpontos számok

Kezdjük egész számokkal . Csak 5 van belőlük, és egy táblázatban leírhatók:

# Írja be a nevet Hossz bájtban Analóg a Java-ból Minimális érték Maximális érték
1 TINYINT 1 byte -128 127
2 KICSIK 2 rövid -32.768 32.767
3 KÖZEPES 3 -8,388,608 8,388,607
4 INT 4 int -2,147,483,648 2,147,483,647
5 BIGINT 8 hosszú -2 63 2 63-1

Az adattípusok nagyon hasonlítanak a Java adattípusokhoz, de létezik egy három bájt hosszúságú egész típus is. Ez a méret megtakarítása érdekében történik.

Ezután jönnek a lebegőpontos típusok , csakúgy, mint a Java-ban, csak kettő van belőlük:

# Írja be a nevet Hossz bájtban Analóg a Java-ból Minimális érték Maximális érték
1 ÚSZÓ 4 úszó -3,40E+38 +1,18E+38
2 KETTŐS 8 kettős -1,79E+308 +1,79E+308

Megint semmi új. Minden ugyanaz, mint a Java-ban. A Java-val ellentétben azonban az SQL-nek van egy másik speciális típusa, a fixpontos valós szám. Tizedesnek hívják.

Általában ezt a típust pénzösszegek tárolására használják. Amikor ennek a típusnak a nevét írjuk, akkor utána általában azt jelzik, hogy a szám hány tizedesjegyű a tizedesvessző előtt és után. Az általános formátum így néz ki:

DECIMAL(total_characters, after_comma)

És egy kis példa:

salary DECIMAL(5,2)

Így írtuk le, hogy a fizetés oszlop tartalmazhat egész számokat (maximum 3 tizedesjegy) és tört részt - 2 tizedesjegyet.

A DECIMAL típus által támogatott karakterek maximális száma 65.

String típusok SQL-ben

Az adatbázisban lévő sorok kétféle formában tárolhatók:

  • Fix hosszúságú húrok
  • Változó hosszúságú húrok

A rögzített hosszúságú karakterláncok CHAR- ként vannak megadva :

CHAR(length)

A rögzített hosszúság azt jelenti, hogy ennek az oszlopnak minden értéke szigorúan rögzített számú karaktert tartalmaz.

Példa egy rögzített hosszúságú karakterláncra:

country_code CHAR(2)

A változó hosszúságú karakterláncokat a VARCHAR típus határozza meg :

VARCHAR(max_length)

A változó hosszúság azt jelenti, hogy ennek az oszlopnak az összes értéke bármilyen hosszúságú szöveget tartalmaz, de legfeljebb a maximális hosszúságnál.

Példa változó hosszúságú karakterláncra:

phone VARCHAR(12)

A fix hosszúságú húroknak nagyon nagy előnyük van. Ha a kliens arra kérte az SQL szervert, hogy adja vissza neki az 1 000 000. sort a táblából, és a tábla sorai fix hosszúságúak, akkor a sor hosszának ismeretében könnyen kiszámíthatja a kívánt bájtokat. sor.

Változó hosszúságú sorok esetén nem lehet gyorsan megtalálni a kívánt sort a táblázatban. Ne feledje az ArrayList és a LinkedList elérésének sebességét, a helyzet nagyjából ugyanaz.

Hasonlítsuk össze, hogy a különböző hosszúságú karakterláncok hogyan tárolódnak egy táblázatban, az adattípustól függően.

Vonal CHAR(4) Tárolandó bájt VARCHAR(4) Tárolandó bájt
'' '' 4 '' 1
"ab" "ab" 4 "ab" 3
"abcd" "abcd" 4 "abcd" 5
"abcdefgh" "abcd" 4 "abcd" 5

Jegyzet. A VARCHAR típus még egy bájtot igényel ugyanennyi hosszúsághoz, mert a karakterlánc hosszát is el kell tárolnia.

Ideiglenes típusok SQL-ben

Az SQL-nek speciális típusai is vannak a dátumok és időpontok tárolására. Összesen öt típus létezik:

# Írja be a nevet Analóg a Java DateTime API-ból Példa Minimális érték Maximális érték
1 DÁTUM LocalDate "2022-06-30" "1000-01-01" '9999-12-31'
2 IDŐ Helyi idő "óó:pp:ss[.tört]" '-838:59:59.000000' '838:59:59.000000'
3 DÁTUM IDŐ LocalDateTime "1000-01-01 00:00:00.000000" '9999-12-31 23:59:59.999999'
4 IDŐBÉLYEG Dátum "1970-01-01 00:00:01.000000" "2038-01-19 03:14:07.999999"
5 ÉV 1901 2155

A lekérdezésekben szereplő összes adat karakterláncként van írva – idézőjelben. A beviteli formátum a legnagyobbtól a legkisebbig terjed:

  • Év
  • Hónap
  • Nap
  • Óra
  • Perc
  • Második
  • A másodperc töredékei

A DATE, TIME és DATETIME típusok hagyományosan a Java DateTme API-ból származó típusok analógjainak tekinthetők: LocalDate, LocalTime, LocalDateTime. A logika nagyjából ugyanaz.

A TIMESTAMP típus ezredmásodpercekben tárolja az adatokat 1970 eleje óta (UNIX operációs rendszer szabvány). Ebben a formában a Dátum típus tárolja őket a Java nyelvben.

És végül ott van a YEAR típus, amely 1 bájt hosszú, és 1-től 255-ig tárolja az értékeket. Ezért a rendelkezésére álló évek tartománya 1901-2155. Az 1900-as évet ez a típus nem tudja eltárolni, mivel a 0 értéket NULL érték kódolására használják.

Objektumok tárolása SQL-ben

Vannak speciális típusok a nagy hosszúságú tárgyak vagy szövegek tárolására. Nem részletezzük őket, de azért felsorolom őket:

# Írja be a nevet Magyarázat
1 SZÖVEG Hosszú szövegek tárolására szolgál. A mező összehasonlításakor és rendezésekor csak az első 100 karakter kerül felhasználásra.
2 FOLT A név a Byte Large Object rövidítése. Csak bájtok gyűjteményeként tárolva. Használható például képek adatbázisban való tárolására.
3 CLOB A név a Charge Large Object rövidítése. Hosszú szövegek tárolására szolgál.
4 ENUM Lehetővé teszi egy rögzített értékkészlet beállítását, és az egyik értékként való tárolását.
5 KÉSZLET Lehetővé teszi egy rögzített értékkészlet beállítását, és ezek bármely részhalmazát értékként tárolja. Általában bináris maszkként tárolja őket.

Elméletileg tetszőleges Java-objektumot szerializálhat bájtkészletként, és BLOB-ként tárolhatja az adatbázisban. Az objektum mentése nem jelent problémát. Hogyan lehet vele tovább dolgozni?

Tegyük fel, hogy egy tábla millió objektumot tárol soros formában – hogyan fog ezek között keresni? A DBMS csak akkor támogat bizonyos típusú adatokat, ha funkciók széles skáláját kínálja a velük való munkavégzéshez.