Introducere în tipurile de date în SQL
Spre deosebire de JavaScript, SQL are o tastare puternică. În fiecare tabel, fiecare coloană are propriul tip de date fix.
Există o mulțime de tipuri de date, dar, spre deosebire de limbajul Java, există atât de multe dintre ele, nu pentru că există tipuri de date pentru toate ocaziile. Bazele de date depind foarte mult de dimensiunea datelor, astfel încât multe tipuri de date diferă unele de altele doar în lungime.
În total, tipurile de date pot fi împărțite în 5 grupuri:
- Tipuri numerice
- Tipuri de șiruri
- Tipuri pentru stocarea datelor și orelor
- Obiecte: de obicei reprezentate ca o colecție de octeți
- Transport : JSON și XML
De obicei, diferite SGBD au în continuare propriile lor tipuri de date. Fiecare DBMS are propria sa specializare, așa că adăugarea de noi tipuri de date este un lucru foarte comun.
Un alt lucru este că doar adăugarea unui nou tip de date nu este suficientă, trebuie să adăugați funcții care vor funcționa cu acesta, precum și să faceți acest lucru comod și rapid.
Dacă lucrați la orice SGBD industrial (întreprindere), atunci cel mai probabil va trebui să vă ocupați de tipurile de date și de funcțiile sale. Pentru ce va fi necesar să citești 2-5 cărți bune.
Ca parte a cunoașterii noastre cu SQL, vom lua în considerare trei grupuri principale de tipuri de date:
- Numerele
- Siruri de caractere
- Datele
Tipuri numerice în SQL
În SQL, tipurile numerice sunt împărțite în trei grupuri:
- Tipuri întregi
- Numere cu virgulă fixă (număr fix de zecimale)
- Numere în virgulă mobilă
Să începem cu numere întregi . Există doar 5 dintre ele și pot fi descrise într-un singur tabel:
# | Tastați numele | Lungime în octeți | Analog din Java | Valoarea minima | Valoare maximă |
---|---|---|---|---|---|
1 | TINYINT | 1 | octet | -128 | 127 |
2 | SMALLINT | 2 | mic de statura | -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 | BIGINT | 8 | lung | -2 63 | 2 63-1 |
Tipurile de date sunt foarte asemănătoare cu tipurile de date Java, dar există și un tip întreg care are trei octeți. Acest lucru se face pentru a economisi dimensiunea.
Urmează tipurile de virgulă mobilă , la fel ca în Java, există doar două dintre ele:
# | Tastați numele | Lungime în octeți | Analog din Java | Valoarea minima | Valoare maximă |
---|---|---|---|---|---|
1 | PLUTI | 4 | pluti | -3,40E+38 | +1.18E+38 |
2 | DUBLA | 8 | dubla | -1,79E+308 | +1,79E+308 |
Din nou, nimic nou. Totul este la fel ca în Java. Cu toate acestea, spre deosebire de Java, SQL are un alt tip special, numărul real în virgulă fixă. Se numește DECIMAL.
De obicei, acest tip este folosit pentru a stoca sume de bani. Când este scris numele acestui tip, apoi după el se indică de obicei câte zecimale are numărul înainte și după virgulă. Formatul general arată astfel:
DECIMAL(total_characters, after_comma)
Și un mic exemplu:
salary DECIMAL(5,2)
Așa am descris faptul că coloana de salariu poate conține numere întregi (maximum 3 zecimale) și o parte fracțională - 2 zecimale.
Numărul maxim de caractere acceptat de tipul DECIMAL este de 65.
Tipuri de șiruri în SQL
Rândurile dintr-o bază de date pot fi stocate în două forme:
- Corzi de lungime fixă
- Corzi cu lungime variabilă
Șirurile cu lungime fixă sunt specificate ca CHAR :
CHAR(length)
Lungime fixă înseamnă că toate valorile acestei coloane vor conține un număr strict fix de caractere.
Un exemplu de șir de lungime fixă:
country_code CHAR(2)
Șirurile de lungime variabilă sunt specificate de tipul VARCHAR :
VARCHAR(max_length)
Lungimea variabilă înseamnă că toate valorile acestei coloane vor conține text de orice lungime, dar nu mai mult decât lungimea maximă.
Exemplu de șir de lungime variabilă:
phone VARCHAR(12)
Corzile cu lungime fixă au un avantaj foarte mare. Dacă clientul a cerut serverului SQL să-i returneze rândul 1.000.000 din tabel, iar rândurile din tabel sunt de lungime fixă, atunci, cunoscând lungimea rândului, puteți calcula cu ușurință octeții care se referă la cel dorit. rând.
În cazul unei lungimi variabile a liniilor, nu va fi posibil să găsiți rapid rândul dorit în tabel. Amintiți-vă de viteza de acces la ArrayList și LinkedList, situația este aproximativ aceeași aici.
Să comparăm cum vor fi stocate șiruri de diferite lungimi într-un tabel, în funcție de tipul de date.
Linia | CHAR(4) | Octet de stocat | VARCHAR(4) | Octet de stocat | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
„abcdefgh” | 'abcd' | 4 | 'abcd' | 5 |
Notă. Tipul VARCHAR necesită încă un octet pentru aceeași lungime, deoarece trebuie să stocheze suplimentar lungimea șirului.
Tipuri temporare în SQL
SQL are, de asemenea, tipuri speciale pentru stocarea datelor și orelor. Există cinci tipuri în total:
# | Tastați numele | Analog din Java DateTime API | Exemplu | Valoarea minima | Valoare maximă |
---|---|---|---|---|---|
1 | DATA | LocalDate | '2022-06-30' | „1000-01-01” | „9999-12-31” |
2 | TIMP | Ora locala | „hh:mm:ss[.fracție]” | „-838:59:59.000000” | „838:59:59.000000” |
3 | DATETIME | LocalDateTime | „1000-01-01 00:00:00.000000” | „9999-12-31 23:59:59.999999” | |
4 | TIMESTAMP-UL | Data | '1970-01-01 00:00:01.000000' | „2038-01-19 03:14:07.999999” | |
5 | AN | 1901 | 2155 |
Toate datele din interogări sunt scrise ca șir - între ghilimele simple. Formatul de intrare merge de la cel mai mare la cel mai mic:
- An
- Lună
- Zi
- Ora
- Minut
- Al doilea
- Fracțiuni de secundă
Tipurile DATE, TIME și DATETIME pot fi considerate în mod convențional analogi ale tipurilor din API-ul Java DateTme: LocalDate, LocalTime, LocalDateTime. Logica este cam aceeași.
Tipul TIMESTAMP stochează date în milisecunde de la începutul anului 1970 (un standard de sistem de operare UNIX). În această formă sunt stocate după tipul Date în limbajul Java.
Și, în sfârșit, există tipul YEAR, care are o lungime de 1 octet și stochează valori de la 1 la 255. Prin urmare, intervalul de ani disponibil pentru acesta este 1901-2155. Anul 1900 nu poate fi stocat de acest tip, deoarece valoarea 0 este folosită pentru a codifica o valoare NULL.
Stocarea obiectelor în SQL
Există tipuri speciale pentru stocarea obiectelor sau a textelor de mare lungime. Nu vom intra în detalii despre ele, dar le voi enumera oricum:
# | Tastați numele | Explicaţie |
---|---|---|
1 | TEXT | Folosit pentru a stoca texte lungi. La compararea și sortarea pe acest câmp, sunt folosite doar primele 100 de caractere. |
2 | BLOB | Numele înseamnă Byte Large Object. Stocat doar ca o colecție de octeți. Poate fi folosit, de exemplu, pentru a stoca imagini într-o bază de date. |
3 | CLOB | Numele înseamnă Char Large Object. Folosit pentru a stoca texte lungi. |
4 | ENUM | Vă permite să setați un set fix de valori și să stocați una dintre ele ca valoare. |
5 | A STABILIT | Vă permite să setați un set fix de valori și să stocați orice subset al acestora ca valoare. De obicei, le stochează ca o mască binară. |
Teoretic, puteți serializa orice obiect Java ca un set de octeți și îl puteți stoca în baza de date ca BLOB. Salvarea obiectului nu este o problemă. Cum să lucrezi mai departe cu el?
Să presupunem că un tabel stochează un milion de obiecte în formă serializată - cum veți căuta printre ele? Un SGBD acceptă doar un anumit tip de date atunci când oferă un set extins de funcții pentru lucrul cu el.