sql >> Databáze >  >> RDS >> SQLite

Jak flexibilní/omezující jsou typy sloupců SQLite?

Typy sloupců SQLite jsou flexibilní (dynamické), primárně se zdá, že se starají o přijetí/přizpůsobení rigidních typů sloupců používaných jinými systémy pro správu databází.

Poznámka! tento Asnwer NEDOPORUČUJE použití podivných a úžasných typů sloupců.

1) Pro typ sloupce můžete použít prakticky jakýkoli název, existují však určitá omezení.

2) Typ sloupce je 2. hodnota v definici sloupce, např. CREATE TABLE table (columnname columntype .....,....) , i když může být vynecháno úmyslně nebo možná neúmyslně Poznámka viz 5a)

3) Prvním omezením je mycolumn INTEGER PRIMARY KEY nebo mycolumn INTEGER PRIMARY KEY AUTOINCREMENT je speciální typ sloupce. Sloupec je alias pro rowid což je jedinečný číselný identifikátor (AUTOINCREMENT ukládá pravidlo, že rowid musí být větší než naposledy použitý rowid pro tabulku, např. pokud řádek používá id (9223372036854775807), pak všechny následné pokusy o přidání řádku povedou k chybě SQLITE FULL. ). Automatické zvýšení SQLite

4) Další omezení je, že typ sloupce nesmí zmást analyzátor SQLite. Například typ sloupce PRIMARY, TABLE, INDEX bude mít za následek výjimku SQLite (chyba syntaxe (kód 1) ) např. když je použit typ sloupce INDEX, pak:-

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

dojde.

5) Typ sloupce není povinný, například CREATE TABLE mytable (...,PRIMARY_COL,.... v takovém případě PRAGMA TABLE_INFO(tablename) neukáže žádný typ, např. (3. řádek).

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) V některých případech SQLite Parser přeskočí na platná KLÍČOVÁ SLOVA, např. CREATE TABLE mytable (mycolumn NOT NULL,... výsledkem je NOT NULL používá se k označení NOT NULL sloupec a typ bere se jako žádný typ (tabulka_info výše byla ve skutečnosti z takového použití).

6) Typ není omezen na jedno slovo, např. VARYING CHARACTER(255) nebo THE BIG BAD WOLF lze specifikovat jako typ, jak je vidět z tohoto výpisu table_info :-

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

Důvod používat nestandardní typy sloupců v SQLite!

Zkrátka ne Důvodem, jak bylo uvedeno na začátku, se zdá, že flexibilita typů sloupců je primárně určena pro snadnou adaptaci SQL z jiných systémů pro správu databází.

Samotné typy sloupců mají malý vliv, protože data budou uložena podle toho, co SQLite určí jako třídu úložiště, která se má použít. S výjimkou rowid (viz 3) výše) libovolný sloupec může obsahovat hodnoty libovolného typu.

S výjimkou dat uložených jako objekt Blob, který je nutné načíst pomocí cursor.getBlob a že kurzor.getBlob nelze použít pro data, která nejsou uložena jako BLOB (getBlob se nezdaří s daty uloženými jako TEXT), můžete do značné míry načíst data (všechny nemusí být nutně užitečné) pomocí libovolného kurzoru cursor.get???? metody.

Zde je několik příkladů:-

Pro sloupec, kde jsou data long myINT = 556677888; je přidán (prostřednictvím ContentValues, např. cv1.put(columnanme,myINT) );

Pak :-

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 se nevrátí k uložené hodnotě, getBlob nemůže uloženou hodnotu získat.

Pro 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 = "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: 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 tady je docela směšný příklad s typem sloupce my_char_is_not_a_char_but_an_int podle 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

Výsledky (uložené jako 'Double' výše) jsou:-

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.

Výše uvedené bylo založeno na následujícím:-Datové typy v SQLite verze 3 SQLite Autoincrement PRAGMA Statements

Kód byl testován/spuštěn na zařízení s emulací GenyMotion s rozhraním API22 zkompilovaným s minimální verzí 14 a cílovou verzí 26.




  1. načíst data spinner ze sqlite a mysql

  2. Postgres pg_dump vypíše databázi pokaždé v jiném pořadí

  3. Opakující se řádky na základě hodnoty sloupce v každém řádku

  4. Logy komprimovaného archivu PostgreSQL ve Windows