SQLite 3 – jak to jest z typami danych w tej bazie danych?

SQLite to silnik bazodanowy, który używa typowania dynamicznego w przeciwieństwie do innych relacyjnych baz danych, które korzystają z typowania statycznego.

Statyczne typowanie polega na tym, że typ danych jest powiązany z kolumną w tabeli i tylko ten typ danych może być w niej przechowywany. W przypadku typowania dynamicznego charakterystycznego dla bazy SQLite, typ danych jest związany z wartością przechowywaną w kolumnie, a nie kolumną. Jedynym wyjątkiem jest liczbowy klucz podstawowy( integer primary key ), który to typ danych jest związany z kolumną.
W związku z tym, SQLite nie wymusza typów dla kolumn, więc nazwa typu danych umieszczana w poleceniu tworzącym tabelę jest tylko informacyjna. Dlatego też, użytkownik może wstawić dowolną wartość w miejsce zadeklarowanego typu danych kolumny(np. wpisać ‚zosia’ w kolumnie typu integer).
Skoro typ danych jest przydzielany dynamicznie, jak wygląda przydzielanie miejsca dla poszczególnych wartości w kolumnach? W SQLite przydzielane jest tyle miejsca dla wartości ile jest niezbędne. Dzięki temu możemy uzyskać mniejszy plik bazy danych.

Mimo, że SQLite pozwala na wpisanie dowolnego typu danych dla kolumny, zawiera pięć klas przechowywania(składowania) danych , które poleca się stosować podczas tworzenia tabel, choć SQLite sam rozpoznaje i dopasowuje wartości wpisane w kolumnach. Przydzielona klasa składowania wpływa na sortowanie danych czy ich porównywanie.
Klasy składowania danych w SQLite:

  • NULL – wartość nieznana, pusta
  • integer – liczby całkowite, wartość zajmuje od 1 do 8 bajtów w zależności od wielkości liczby
  • real – liczby dziesiętne, przechowywana jako 8-bajtowe wartości
  • text – łańcuch znakowy, tekst kodowany jako UTF-8, UTF-16BE, UTF-16LE
  • blob – dane binarne

Dla wartość boolean nie ma wydzielonej klasy przechowywania danych więc przyjmuje się, że dla false jest to integer równe 0, a dla true integer równe 1.

Dla typu danych daty i czasu można używać klasy przechowywania:
text – w formacie ‚YYYY-MM-DD HH:MM:SS.SSS’,
real – ilość dni wg kalendarza juliańskiego, które upłynęły od 24.10.4714 r. p.n.e., np. 355,2 dni
integer – czas Unix – ilość sekund, które upłynęły od 01.01.1970 r. UTC .

SQLite podczas automatycznego przydzielania klasy do wartości stosuje następującą kolejność:

Wartość ujęta w cudzysłów lub w apostrofach jest uznawana za text . Jeśli warunek ten nie jest spełniony, a jest to liczba bez separatora kropki, czy wykładnika, jest przydzielany typ integer . Jeśli poprzednie warunki nie są spełnione a jest to liczba z separatorem kropki lub wykładnikiem jest nadawana klasa real .  Jest nadawany typ blob , gdy dane pochodzą z funkcji interfejsu API dla danych binarnych lub typ NULL w pozostałych przypadkach.

SQLite zawiera klasy podobieństw typów danych występujących w innych bazach, aby uniknąć niewłaściwej konwersji danych np. podczas ich przenoszenia z innego sytemu relacyjnych baz danych. Ich zastosowanie wymusi konwersję na typ danych jakiego oczekujemy.
Typy affinity wg kolejności konwersji:
1. integer – typ całkowity(wszystkie typy ze słowem int),
2. text – typy ze słowem char oraz clob, text,
3. blob – blob, none ; dane binarne lub niezdefiniowany typ danych
4. real – typ zmiennoprzecinkowy: real, double,float,
5. numeric – typ numeryczny: numeric, decimal, boolean, datetime, date