sql >> Databasteknik >  >> RDS >> SQLite

Hur flexibla/begränsande är SQLite-kolumntyper?

SQLite-kolumntyper är flexibla (dynamiska), i första hand tycks de tillgodose antagandet/anpassningen av stela kolumntyper som används av andra databashanteringssystem.

Obs! denna Asnwer rekommenderar INTE användning av konstiga och underbara kolumntyper.

1) Du kan faktiskt använda praktiskt taget vilket namn som helst för en kolumntyp, det finns dock vissa begränsningar.

2) Kolumntyp är det 2:a värdet i kolumndefinitionen t.ex. CREATE TABLE table (columnname columntype .....,....) , även om det kan utelämnas avsiktligt eller kanske oavsiktligt Obs, se 5a)

3) Den första begränsningen är att mycolumn INTEGER PRIMARY KEY eller mycolumn INTEGER PRIMARY KEY AUTOINCREMENT är en speciell kolumntyp. Kolumnen är ett alias för rowid som är en unik numerisk identifierare (AUTOINCREMENT inför en regel som rovid måste vara större än den senast använda rowid för bordet t.ex. om en rad använder id (9223372036854775807) kommer alla efterföljande försök att lägga till en rad att resultera i ett SQLITE FULL-fel. ). SQLite Autoincrement

4) Andra begränsningar är att kolumntypen inte får förvirra SQLite-tolken. Till exempel kommer en kolumntyp PRIMARY, TABLE, INDEX att resultera i ett SQLite-undantag (syntaxfel (kod 1) ) t.ex. när en kolumntyp INDEX används då:-

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

inträffar.

5) En kolumntyp är inte obligatorisk, till exempel CREATE TABLE mytable (...,PRIMARY_COL,.... i vilket fall en PRAGMA TABLE_INFO(tablename) visar ingen typ t.ex. (3:e raden).

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) I vissa fall hoppar SQLite Parser till giltiga KEYWORDS, t.ex. CREATE TABLE mytable (mycolumn NOT NULL,... resulterar i NOT NULL används för att indikera en NOT NULL kolumnen och typen tas som ingen typ (tabellinfo ovan var faktiskt från en sådan användning).

6) En typ är inte begränsad till ett enda ord t.ex. VARYING CHARACTER(255) eller THE BIG BAD WOLF kan anges som en typ som kan ses från detta table_info-extrakt :-

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

Anledningen till att använda icke-standardiserade kolumntyper i SQLite!

Kort sagt, det finns nej anledningen, som nämnts till en början, verkar flexibiliteten hos kolumntyper främst vara för att tillgodose en enkel anpassning av SQL från andra databashanteringssystem.

Kolumntyper i sig har liten effekt eftersom data kommer att lagras enligt vad SQLite bestämmer som lagringsklass som ska användas. Med undantag för rowid (se 3) ovan) kan vilken kolumn som helst innehålla värden av vilken typ som helst.

Med undantag för data lagrad som en Blob, som måste hämtas med cursor.getBlob och att cursor.getBlob inte kan användas för data som inte är lagrade som en BLOB (getBlob misslyckas inte med data lagrad som TEXT), Du kan i mycket hög grad hämta data (alla om det inte nödvändigtvis är användbart) med någon av cursor.get???? metoder.

Här är några exempel:-

För en kolumn där data long myINT = 556677888; läggs till (via ContentValues ​​t.ex. cv1.put(columnanme,myINT) );

Sedan :-

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 återgår inte till det lagrade värdet, getBlob kan inte få det lagrade värdet.

För 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.

För 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]<<

Och här är ett ganska löjligt exempel med kolumntypen my_char_is_not_a_char_but_an_int enligt 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

Resultaten (lagrade enligt 'Dubbel' ovan) är:-

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.

Ovanstående baserades på följande:-Datatyper i SQLite version 3 SQLite Autoincrement PRAGMA-satser

Koden testades/kördes på en GenyMotion-emulerad enhet som kör API22, kompilerad med en minsta version av 14 och mål på 26.




  1. Hitta sql-poster som innehåller liknande strängar

  2. SQL, hur man använder SELECT

  3. Hur infogar man en bild i rummets beständighetsbibliotek?

  4. Hur vet jag när min docker mysql-behållare är uppe och mysql är redo att ta emot frågor?