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.