Inleiding tot gegevenstypen in SQL
In tegenstelling tot JavaScript heeft SQL sterk typen. In elke tabel heeft elke kolom zijn eigen vaste gegevenstype.
Er zijn veel gegevenstypen, maar in tegenstelling tot de Java-taal zijn er zoveel, niet omdat er gegevenstypen zijn voor alle gelegenheden. Databases zijn erg afhankelijk van de grootte van de gegevens, dus veel gegevenstypen verschillen alleen in lengte van elkaar.
In totaal kunnen gegevenstypen worden onderverdeeld in 5 groepen:
- Numerieke typen
- Tekenreeks typen
- Typen voor het opslaan van datums en tijden
- Objecten: meestal weergegeven als een verzameling bytes
- Transport : JSON en XML
Meestal hebben verschillende DBMS nog steeds hun eigen datatypes. Elk DBMS heeft zijn eigen specialisatie, dus het toevoegen van nieuwe datatypes is heel gewoon.
Een ander ding is dat alleen het toevoegen van een nieuw gegevenstype niet genoeg is, je moet functies toevoegen die ermee werken, en dit ook gemakkelijk en snel laten werken.
Als u aan een industrieel (bedrijfs) DBMS werkt, krijgt u hoogstwaarschijnlijk te maken met de gegevenstypen en de functies ervan. Voor wat het nodig zal zijn om 2-5 goede boeken te lezen.
Als onderdeel van onze kennismaking met SQL, zullen we drie hoofdgroepen van gegevenstypen beschouwen:
- Nummers
- Snaren
- Datums
Numerieke typen in SQL
In SQL zijn numerieke typen onderverdeeld in drie groepen:
- Integer typen
- Vaste kommagetallen (vast aantal decimalen)
- Drijvende kommagetallen
Laten we beginnen met gehele getallen . Er zijn er maar 5 en ze kunnen in één tabel worden beschreven:
# | Typ naam | Lengte in bytes | Analoog van Java | Minimale waarde | Maximale waarde |
---|---|---|---|---|---|
1 | KLEINEINT | 1 | byte | -128 | 127 |
2 | KLEININT | 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 | BIGINT | 8 | lang | -2 63 | 2 63-1 |
De gegevenstypen lijken erg op de Java-gegevenstypen, maar er is ook een integer-type dat drie bytes lang is. Dit wordt gedaan om grootte te besparen.
Vervolgens komen de typen met drijvende komma , net als in Java, er zijn er maar twee:
# | Typ naam | Lengte in bytes | Analoog van Java | Minimale waarde | Maximale waarde |
---|---|---|---|---|---|
1 | VLOT | 4 | vlot | -3.40E+38 | +1.18E+38 |
2 | DUBBELE | 8 | dubbele | -1.79E+308 | +1.79E+308 |
Nogmaals, niets nieuws. Alles is hetzelfde als op Java. In tegenstelling tot Java heeft SQL echter een ander speciaal type, het reële getal met een vast punt. Het heet DECIMAAL.
Meestal wordt dit type gebruikt om geldbedragen op te slaan. Wanneer de naam van dit type wordt geschreven, wordt daarna meestal aangegeven hoeveel decimalen het getal voor en achter de komma heeft. De algemene indeling ziet er als volgt uit:
DECIMAL(total_characters, after_comma)
En een klein voorbeeld:
salary DECIMAL(5,2)
Zo beschreven we het feit dat de salariskolom gehele getallen (maximaal 3 decimalen) en een breukdeel - 2 decimalen kan bevatten.
Het maximale aantal tekens dat door het type DECIMAL wordt ondersteund, is 65.
Tekenreekstypen in SQL
Rijen in een database kunnen in twee vormen worden opgeslagen:
- Snaren met vaste lengte
- Strings met variabele lengte
Strings met een vaste lengte worden gespecificeerd als CHAR :
CHAR(length)
Vaste lengte betekent dat alle waarden van deze kolom een strikt vast aantal tekens bevatten.
Een voorbeeld van een string met vaste lengte:
country_code CHAR(2)
Strings met variabele lengte worden gespecificeerd door het type VARCHAR :
VARCHAR(max_length)
Variabele lengte betekent dat alle waarden van deze kolom tekst van elke lengte zullen bevatten, maar niet meer dan de maximale lengte.
Voorbeeld van string met variabele lengte:
phone VARCHAR(12)
Snaren met een vaste lengte hebben een heel groot voordeel. Als de client de SQL-server heeft gevraagd om de 1.000.000ste rij uit de tabel naar hem terug te sturen, en de rijen in de tabel hebben een vaste lengte, dan kunt u, als u de lengte van de rij kent, eenvoudig de bytes berekenen die betrekking hebben op de gewenste rij.
Bij een variabele lengte van regels zal het niet mogelijk zijn om snel de gewenste rij in de tabel te vinden. Denk aan de snelheid van toegang tot ArrayList en LinkedList, de situatie is hier ongeveer hetzelfde.
Laten we vergelijken hoe tekenreeksen van verschillende lengte in een tabel worden opgeslagen, afhankelijk van het gegevenstype.
Lijn | TEKEN(4) | Byte om op te slaan | VARCHAR(4) | Byte om op te slaan | |
---|---|---|---|---|---|
'' | '' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
'abcdefgh' | 'abcd' | 4 | 'abcd' | 5 |
Opmerking. Het type VARCHAR vereist nog een byte voor dezelfde lengte, omdat het bovendien de lengte van de string moet opslaan.
Tijdelijke typen in SQL
SQL heeft ook speciale typen voor het opslaan van datums en tijden. Er zijn in totaal vijf soorten:
# | Typ naam | Analoog van Java DateTime API | Voorbeeld | Minimale waarde | Maximale waarde |
---|---|---|---|---|---|
1 | DATUM | LokaleDatum | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | TIJD | Lokale tijd | 'hh:mm:ss[.fractie]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATUM TIJD | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | TIJDSTAMP | Datum | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | JAAR | 1901 | 2155 |
Alle gegevens in query's worden geschreven als een tekenreeks - tussen enkele aanhalingstekens. Het invoerformaat gaat van groot naar klein:
- Jaar
- Maand
- Dag
- Uur
- Minuut
- Seconde
- Fracties van een seconde
De typen DATE, TIME en DATETIME kunnen conventioneel worden beschouwd als analogen van de typen uit de Java DateTme API: LocalDate, LocalTime, LocalDateTime. De logica is ongeveer hetzelfde.
Het TIMESTAMP-type slaat gegevens op in milliseconden sinds het begin van 1970 (een UNIX-besturingssysteemstandaard). In deze vorm worden ze opgeslagen door het type Datum in de Java-taal.
En tot slot is er het JAAR-type, dat 1 byte lang is en waarden van 1 tot 255 opslaat. Daarom is het bereik van beschikbare jaren 1901-2155. Het jaar 1900 kan niet worden opgeslagen door dit type, aangezien de waarde 0 wordt gebruikt om een NULL-waarde te coderen.
Objecten opslaan in SQL
Voor het opbergen van voorwerpen of teksten van grote lengte zijn er speciale typen. We zullen er niet in detail op ingaan, maar ik zal ze toch opsommen:
# | Typ naam | Uitleg |
---|---|---|
1 | TEKST | Gebruikt om lange teksten op te slaan. Bij het vergelijken en sorteren op dit veld worden alleen de eerste 100 karakters gebruikt. |
2 | BLOB | De naam staat voor Byte Large Object. Opgeslagen als slechts een verzameling bytes. Kan worden gebruikt om bijvoorbeeld afbeeldingen op te slaan in een database. |
3 | KLOB | De naam staat voor Char Large Object. Gebruikt om lange teksten op te slaan. |
4 | ENUM | Hiermee kunt u een vaste set waarden instellen en een daarvan als waarde opslaan. |
5 | SET | Hiermee kunt u een vaste set waarden instellen en elke subset daarvan als waarde opslaan. Slaat ze meestal op als een binair masker. |
Theoretisch kun je elk Java-object serialiseren als een set bytes en het in de database opslaan als een BLOB. Het opslaan van het object is geen probleem. Hoe verder met hem te werken?
Laten we zeggen dat een tabel een miljoen objecten in geserialiseerde vorm opslaat - hoe gaat u ze doorzoeken? Een DBMS ondersteunt alleen een bepaald type gegevens als het een uitgebreide set functies biedt om ermee te werken.