SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Jak elastyczne/ograniczające są typy kolumn SQLite?

Typy kolumn SQLite są elastyczne (dynamiczne), przede wszystkim wydaje się, że pozwalają na przyjęcie/adaptację sztywnych typów kolumn używanych przez inne systemy zarządzania bazami danych.

Uwaga! ta odpowiedź NIE zaleca używania dziwnych i wspaniałych typów kolumn.

1) Właściwie możesz użyć praktycznie dowolnej nazwy dla typu kolumny, istnieją jednak pewne ograniczenia.

2) Typ kolumny to druga wartość w definicji kolumny, np. CREATE TABLE tabela (typ kolumny nazwa kolumny .....,....) , chociaż może być pominięty celowo lub być może nieumyślnie Uwaga:patrz 5a)

3) Pierwszym ograniczeniem jest to, że mojakolumna KLUCZ PODSTAWOWY CAŁKOWITY lub mojakolumna CAŁKOWITY AUTOMATYCZNY WZROST KLUCZA PODSTAWOWEGO to specjalny typ kolumny. Kolumna jest aliasem dla rowid który jest unikalnym identyfikatorem numerycznym (AUTOINCREMENT narzuca regułę, że rowid musi być większy niż ostatnio użyty wiersz w tabeli, np. jeśli wiersz używa identyfikatora (9223372036854775807), każda kolejna próba dodania wiersza spowoduje błąd SQLITE FULL. ). Autoinkrementacja SQLite

4) Inne ograniczenia polegają na tym, że typ kolumny nie może mylić parsera SQLite. Na przykład typ kolumny PRIMARY, TABLE, INDEX spowoduje wystąpienie wyjątku SQLite (błąd składni (kod 1) ) np. gdy używany jest typ kolumny INDEX, to:-

android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):

wystąpi.

5) Typ kolumny nie jest obowiązkowy, na przykład CREATE TABLE mojatabela (...,PRIMARY_COL,.... w takim przypadku PRAGMA TABLE_INFO(nazwa tabeli) nie pokaże żadnego typu, np. (3. linia).

08-08 07:56:23.391 13097-13097/? D/TBL_INFO: Col=cid Value=8
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=name Value=PRIMARY_COL
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=type Value=
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=notnull Value=1
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=dflt_value Value=null
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=pk Value=0

5a) W niektórych przypadkach Parser SQLite przeskoczy do prawidłowych SŁÓW KLUCZOWYCH, np. CREATE TABLE mojatabela (mojakolumna NOT NULL,... wyniki w NOT NULL używany do wskazania NOT NULL kolumna i typ brane jako bez typu (powyższy table_info pochodzi z takiego użycia).

6) Typ nie jest ograniczony do jednego słowa, np. RÓŻNE ZNAKI(255) lub WIELKI ZŁY WILK można określić jako typ, jak widać z tego wyciągu table_info :-

08-08 08:23:26.423 4799-4799/? D/   TBLINFO: Col=type Value=THE BIG BAD WOLF

Powód używania niestandardowych typów kolumn w SQLite!

Krótko mówiąc, nie ma nie powód, jak stwierdzono na początku, elastyczność typów kolumn wydaje się służyć przede wszystkim łatwej adaptacji SQL z innych systemów zarządzania bazami danych.

Same typy kolumn mają niewielki wpływ, ponieważ dane będą przechowywane zgodnie z tym, co SQLite określa jako używaną klasę pamięci. Z wyjątkiem rowid (patrz 3) powyżej) każda kolumna może zawierać wartości dowolnego typu.

Z wyjątkiem danych przechowywanych jako obiekty Blob, które należy pobrać za pomocą cursor.getBlob i ten kursor.getBlob nie może być użyty do danych, które nie są przechowywane jako BLOB (getBlob nie zawodzi z danymi przechowywanymi jako TEKST). .get???? metody.

Oto kilka przykładów:-

Dla kolumny, w której dane long myINT =556677888; jest dodany (poprzez ContentValues, np. cv1.put(columnanme,myINT) );

Wtedy :-

08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=INTEGER_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>5.56677888E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>5.566779E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>15104<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.

getShort nie powraca do przechowywanej wartości, getBlob nie może pobrać przechowywanej wartości.

Dla Double myREAL =213456789.4528791134567890109643534276; :-

08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>6037<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.

For String myTEXT ="Leniwy, szybki brązowy lis przeskoczył przez płot lub coś w tym stylu.";

08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=TEXT_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>The Lazy Quick Brown Fox Jumped Over the Fence or something like that.<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS BLOB >>[[email protected]<<

A oto dość śmieszny przykład z typem kolumny my_char_is_not_a_char_but_an_int zgodnie z PRAGMA TABLE_INFO :-

08-08 09:19:03.657 13575-13575/mjt.soqanda D/TBL_INFO: Col=cid Value=7
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=name Value=my_char_is_not_a_char_but_an_int_COL
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=type Value=my_char_is_not_a_char_but_an_int
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=notnull Value=0
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=dflt_value Value=null
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=pk Value=0

Wyniki (przechowywane zgodnie z 'Double' powyżej) to:-

08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Column=my_char_is_not_a_char_but_an_int_COL<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>6037<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.

Powyższe zostało oparte na następujących:Typy danych w SQLite Wersja 3 SQLite Autoincrement Wypowiedzi PRAGMA

Kod został przetestowany/uruchomiony na emulowanym urządzeniu GenyMotion z interfejsem API22 skompilowanym z minimalną wersją 14 i celem 26.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest SQLite

  2. Baza danych pokoju Android nie wyeksportuje wszystkich danych

  3. Pobierz pierwszy, drugi, trzeci lub czwarty poniedziałek miesiąca w SQLite

  4. SQLite - Eksportuj dane do pliku CSV

  5. Operatory do wyodrębniania podkomponentów JSON