sql >> Database teknologi >  >> RDS >> SQLite

Hvor fleksible/begrænsende er SQLite-kolonnetyper?

SQLite kolonnetyper er fleksible (dynamiske), primært ser det ud til at tage højde for adoption/tilpasning af stive kolonnetyper, der bruges af andre databasestyringssystemer.

Bemærk! denne Asnwer anbefaler IKKE brug af mærkelige og vidunderlige kolonnetyper.

1) Du kan faktisk bruge stort set ethvert navn til en kolonnetype, der er dog nogle begrænsninger.

2) Kolonnetype er 2. værdi i kolonnedefinitionen f.eks. CREATE TABLE table (columnname columntype .....,....) , selvom det kan være udeladt med vilje eller måske utilsigtet Bemærk se 5a)

3) Den første begrænsning er den mycolumn INTEGER PRIMARY KEY eller mycolumn INTEGER PRIMARY KEY AUTOINCREMENT er en speciel kolonnetype. Kolonnen er et alias for rowid som er en unik numerisk identifikator (AUTOINCREMENT pålægger en regel om, at rovid skal være større end den sidst brugte rowid til bordet f.eks. hvis en række bruger id (9223372036854775807), vil ethvert efterfølgende forsøg på at tilføje en række resultere i en SQLITE FULL-fejl. ). SQLite Autoincrement

4) Andre begrænsninger er, at kolonnetypen ikke må forvirre SQLite-parseren. For eksempel vil en kolonnetype PRIMARY, TABLE, INDEX resultere i en SQLite-undtagelse (syntaksfejl (kode 1) ) for eksempel. når en kolonnetype INDEX bruges, så:-

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

forekommer.

5) En kolonnetype er ikke obligatorisk, f.eks. CREATE TABLE mytable (...,PRIMARY_COL,.... i hvilket tilfælde en PRAGMA TABLE_INFO(tablename) vil ikke vise nogen type f.eks. (3. linje).

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 nogle tilfælde vil SQLite Parser springe til gyldige NØGLEORD, f.eks. CREATE TABLE mytable (mycolumn NOT NULL,... resulterer i NOT NULL bruges til at angive en NOT NULL kolonnen og typen bliver taget som ingen type (Ovenstående tabel_info var faktisk fra sådan en brug).

6) En type er ikke begrænset til et enkelt ord, f.eks. VARYING CHARACTER(255) eller THE BIG BAD WOLF kan angives som en type, som det kan ses af dette tabelinfo uddrag :-

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

Grunden til at bruge ikke-standard kolonnetyper i SQLite!

Kort sagt er der nej grunden, som nævnt i første omgang, synes fleksibiliteten af ​​kolonnetyper primært at tage højde for den lette tilpasning af SQL fra andre databasestyringssystemer.

Kolonnetyper i sig selv har ringe effekt, da data vil blive lagret i henhold til, hvad SQLite bestemmer som lagerklassen, der skal bruges. Med undtagelse af rovid (se 3) ovenfor) kan enhver kolonne indeholde værdier af enhver type.

Med undtagelse af data gemt som en Blob, som skal hentes ved hjælp af cursor.getBlob og at cursor.getBlob ikke kan bruges til data, der ikke er gemt som en BLOB (getBlob fejler ikke med data gemt som TEXT), Du kan i høj grad hente data (alt om det ikke nødvendigvis er nyttigt) ved at bruge en af ​​cursor.get???? metoder.

Her er nogle eksempler:-

For en kolonne, hvor dataene long myINT = 556677888; tilføjes (via ContentValues, f.eks. cv1.put(columnanme,myINT) );

Så :-

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 vender ikke tilbage til den lagrede værdi, getBlob kan ikke hente den lagrede værdi.

For 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]<<
 

Og her er et ret latterligt eksempel med en kolonnetype my_char_is_not_a_char_but_an_int i henhold til 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
 

Resultater (gemt som i 'Dobbelt' ovenfor) er:-

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.

Ovenstående var baseret på følgende:-Datatyper i SQLite Version 3 SQLite Autoincrement PRAGMA Statements

Koden blev testet/kørt på en GenyMotion-emuleret enhed, der kører API22, kompileret med en minimumsversion på 14 og mål på 26.




  1. Dvalebrug af PostgreSQL-sekvens påvirker ikke sekvenstabellen

  2. Hent række-id for en SQLite FTS3-tabel

  3. Få en liste over alle funktioner og procedurer i en Oracle-database

  4. Android Studio markerer/fremhæver ikke Kotlin Room DAO-forespørgsler, når strengen optager mere end 1 række