Wprowadzenie do typów danych w SQL
W przeciwieństwie do JavaScript, SQL ma silne typowanie. W każdej tabeli każda kolumna ma swój własny stały typ danych.
Istnieje wiele typów danych, ale w przeciwieństwie do języka Java jest ich tak wiele nie dlatego, że istnieją typy danych na każdą okazję. Bazy danych są bardzo zależne od rozmiaru danych, więc wiele typów danych różni się od siebie tylko długością.
Łącznie typy danych można podzielić na 5 grup:
- Typy liczbowe
- Typy ciągów
- Typy przechowywania dat i godzin
- Obiekty: zwykle reprezentowane jako zbiór bajtów
- Transport : JSON i XML
Zwykle różne DBMS nadal mają swoje własne typy danych. Każdy DBMS ma swoją własną specjalizację, więc dodawanie nowych typów danych jest bardzo powszechną rzeczą.
Inna sprawa, że samo dodanie nowego typu danych nie wystarczy, trzeba dodać funkcje, które będą z nim współpracować, a także sprawić, by ta praca była wygodna i szybka.
Jeśli pracujesz na jakimkolwiek przemysłowym (korporacyjnym) DBMS, najprawdopodobniej będziesz miał do czynienia z jego typami danych i jego funkcjami. Na co trzeba będzie przeczytać 2-5 dobrych książek.
W ramach naszej znajomości języka SQL rozważymy trzy główne grupy typów danych:
- Liczby
- Smyczki
- Daktyle
Typy liczbowe w SQL
W języku SQL typy liczbowe dzielą się na trzy grupy:
- Typy całkowite
- Liczby stałoprzecinkowe (stała liczba miejsc dziesiętnych)
- Liczb zmiennoprzecinkowych
Zacznijmy od liczb całkowitych . Jest ich tylko 5 i można je opisać w jednej tabeli:
# | Wpisz imię | Długość w bajtach | Analog z Javy | Minimalna wartość | Maksymalna wartość |
---|---|---|---|---|---|
1 | MALUTKI | 1 | bajt | -128 | 127 |
2 | MAŁE INT | 2 | krótki | -32,768 | 32.767 |
3 | ŚREDNI MIĘTOWY | 3 | -8 388 608 | 8388607 | |
4 | INT | 4 | int | -2147483648 | 2147483647 |
5 | DUŻE | 8 | długi | -2 63 | 2 63-1 |
Typy danych są bardzo podobne do typów danych Java, ale istnieje również typ całkowity o długości trzech bajtów. Odbywa się to w celu zaoszczędzenia na rozmiarze.
Dalej są typy zmiennoprzecinkowe , podobnie jak w Javie, są tylko dwa z nich:
# | Wpisz imię | Długość w bajtach | Analog z Javy | Minimalna wartość | Maksymalna wartość |
---|---|---|---|---|---|
1 | PLATFORMA | 4 | platforma | -3,40E+38 | +1,18E+38 |
2 | PODWÓJNIE | 8 | podwójnie | -1,79E+308 | +1,79E+308 |
Znowu nic nowego. Wszystko jest takie samo jak w Javie. Jednak w przeciwieństwie do Javy, SQL ma inny specjalny typ, liczbę rzeczywistą stałoprzecinkową. Nazywa się DZIESIĘTNIE.
Zazwyczaj ten typ jest używany do przechowywania kwot pieniędzy. Kiedy zapisywana jest nazwa tego typu, to po niej zwykle wskazuje się, ile miejsc po przecinku ma liczba przed i po przecinku. Ogólny format wygląda następująco:
DECIMAL(total_characters, after_comma)
I mały przykład:
salary DECIMAL(5,2)
Tak opisaliśmy fakt, że kolumna wynagrodzeń może zawierać liczby całkowite (maksymalnie 3 miejsca po przecinku) oraz część ułamkową - 2 miejsca po przecinku.
Maksymalna liczba znaków obsługiwana przez typ DECIMAL wynosi 65.
Typy łańcuchów w SQL
Wiersze w bazie danych mogą być przechowywane w dwóch formach:
- Ciągi o stałej długości
- Ciągi o zmiennej długości
Łańcuchy o stałej długości są określane jako CHAR :
CHAR(length)
Stała długość oznacza, że wszystkie wartości tej kolumny będą zawierać ściśle ustaloną liczbę znaków.
Przykład łańcucha o stałej długości:
country_code CHAR(2)
Łańcuchy o zmiennej długości są określone przez typ VARCHAR :
VARCHAR(max_length)
Zmienna długość oznacza, że wszystkie wartości tej kolumny będą zawierać tekst o dowolnej długości, ale nie większej niż długość maksymalna.
Przykład łańcucha o zmiennej długości:
phone VARCHAR(12)
Struny o stałej długości mają bardzo dużą zaletę. Jeśli klient poprosił serwer SQL o zwrócenie mu 1 000 000 wiersza z tabeli, a wiersze w tabeli mają stałą długość, to znając długość wiersza, można łatwo obliczyć bajty, które odnoszą się do żądanego wiersz.
W przypadku zmiennej długości linii nie będzie możliwe szybkie odnalezienie żądanego wiersza w tabeli. Pamiętaj o szybkości dostępu do ArrayList i LinkedList, tutaj sytuacja jest mniej więcej taka sama.
Porównajmy, jak ciągi o różnej długości będą przechowywane w tabeli, w zależności od typu danych.
Linia | ZNAK(4) | Bajt do przechowywania | VARCHAR(4) | Bajt do przechowywania | |
---|---|---|---|---|---|
'' | '' | 4 | '' | 1 | |
„ab” | „ab” | 4 | „ab” | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
'abcdefgh' | 'abcd' | 4 | 'abcd' | 5 |
Notatka. Typ VARCHAR wymaga jeszcze jednego bajtu dla tej samej długości, ponieważ musi dodatkowo przechowywać długość łańcucha.
Tymczasowe typy w SQL
SQL ma również specjalne typy do przechowywania dat i godzin. W sumie istnieje pięć typów:
# | Wpisz imię | Analog z Java DateTime API | Przykład | Minimalna wartość | Maksymalna wartość |
---|---|---|---|---|---|
1 | DATA | Data lokalna | „2022-06-30” | „1000-01-01” | „9999-12-31” |
2 | CZAS | Czas lokalny | 'gg:mm:ss[.ułamek]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATAGODZINA | LocalDateTime | „1000-01-01 00:00:00.000000” | „9999-12-31 23:59:59.999999” | |
4 | ZNAK CZASU | Data | „1970-01-01 00:00:01.000000” | „2038-01-19 03:14:07.999999” | |
5 | ROK | 1901 | 2155 |
Wszystkie dane w zapytaniach są zapisywane jako string - w pojedynczych cudzysłowach. Format wpisu przebiega od największego do najmniejszego:
- Rok
- Miesiąc
- Dzień
- Godzina
- Minuta
- Drugi
- Ułamki sekundy
Typy DATE, TIME i DATETIME można umownie uważać za odpowiedniki typów z Java DateTme API: LocalDate, LocalTime, LocalDateTime. Logika jest mniej więcej taka sama.
Typ TIMESTAMP przechowuje dane w milisekundach od początku 1970 roku (standard systemu operacyjnego UNIX). W takiej formie są one przechowywane przez typ Date w języku Java.
I wreszcie jest jeszcze typ ROK, który ma długość 1 bajta i przechowuje wartości od 1 do 255. Dlatego zakres dostępnych dla niego lat to 1901-2155. Rok 1900 nie może być przechowywany przez ten typ, ponieważ wartość 0 jest używana do kodowania wartości NULL.
Przechowywanie obiektów w SQL
Istnieją specjalne typy do przechowywania obiektów lub tekstów o dużej długości. Nie będziemy wchodzić w szczegóły, ale i tak je wymienię:
# | Wpisz imię | Wyjaśnienie |
---|---|---|
1 | TEKST | Służy do przechowywania długich tekstów. Podczas porównywania i sortowania według tego pola używanych jest tylko pierwszych 100 znaków. |
2 | KROPELKA | Nazwa oznacza Byte Large Object. Przechowywane jako zbiór bajtów. Może służyć na przykład do przechowywania zdjęć w bazie danych. |
3 | KLOB | Nazwa oznacza Char Large Object. Służy do przechowywania długich tekstów. |
4 | WYLICZENIE | Pozwala ustawić stały zestaw wartości i zapisać jedną z nich jako wartość. |
5 | USTAWIĆ | Umożliwia ustawienie stałego zestawu wartości i przechowywanie dowolnego ich podzbioru jako wartości. Zwykle przechowuje je jako maskę binarną. |
Teoretycznie można serializować dowolny obiekt Java jako zestaw bajtów i przechowywać go w bazie danych jako obiekt BLOB. Zapisanie obiektu nie stanowi problemu. Jak dalej z nim współpracować?
Załóżmy, że tabela przechowuje milion obiektów w postaci serializowanej — jak je przeszukasz? DBMS obsługuje określony typ danych tylko wtedy, gdy udostępnia rozbudowany zestaw funkcji do pracy z nimi.
GO TO FULL VERSION