sql >> Database >  >> RDS >> SQLite

Hoe flexibel/beperkend zijn SQLite-kolomtypen?

SQLite-kolomtypen zijn flexibel (dynamisch), in de eerste plaats lijkt het te voorzien in de acceptatie/aanpassing van starre kolomtypen die worden gebruikt door andere databasebeheersystemen.

Let op! deze Asnwer raadt GEEN gebruik van rare en prachtige kolomtypes aan.

1) U kunt vrijwel elke naam voor een kolomtype gebruiken, er zijn echter enkele beperkingen.

2) Kolomtype is de 2e waarde in de kolomdefinitie, b.v. CREATE TABLE table (columnname columntype .....,....) , hoewel het opzettelijk of misschien per ongeluk kan worden weggelaten Opmerking zie 5a)

3) De eerste beperking is dat mycolumn INTEGER PRIMARY KEY of mycolumn INTEGER PRIMARY KEY AUTOINCREMENT is een speciaal kolomtype. De kolom is een alias voor de rowid wat een unieke numerieke identificatie is (AUTOINCREMENT legt een regel op dat de rowid moet groter zijn dan de laatst gebruikte rowid voor de tabel, b.v. als een rij id (9223372036854775807) gebruikt, zullen alle volgende pogingen om een ​​rij toe te voegen resulteren in een SQLITE FULL-fout. ). SQLite automatisch verhogen

4) Andere beperkingen zijn dat het kolomtype de SQLite-parser niet in de war mag brengen. Een kolomtype PRIMAIR, TABLE, INDEX zal bijvoorbeeld resulteren in een SQLite-uitzondering (syntaxisfout (code 1) ) bijv. wanneer een kolomtype INDEX wordt gebruikt, dan:-

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

gebeurt.

5) Een kolomtype is niet verplicht, bijvoorbeeld CREATE TABLE mytable (...,PRIMARY_COL,.... in dat geval een PRAGMA TABLE_INFO(tablename) zal geen type tonen, b.v. (3e regel).

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) In sommige gevallen zal de SQLite Parser overslaan naar geldige KEYWORDS, b.v. CREATE TABLE mytable (mycolumn NOT NULL,... resulteert in NOT NULL wordt gebruikt om een ​​NOT NULL . aan te geven kolom en het type wordt genomen als geen type (de table_info hierboven was eigenlijk van een dergelijk gebruik).

6) Een type is niet beperkt tot een enkel woord, b.v. VARYING CHARACTER(255) of THE BIG BAD WOLF kan worden gespecificeerd als een type zoals blijkt uit dit table_info extract :-

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

De reden om niet-standaard kolomtypes te gebruiken in SQLite!

Kortom er is geen reden, zoals eerst vermeld, lijkt de flexibiliteit van kolomtypen voornamelijk te zijn om te voorzien in de gemakkelijke aanpassing van SQL vanuit andere databasebeheersystemen.

Kolomtypes zelf hebben weinig effect omdat gegevens worden opgeslagen volgens wat SQLite bepaalt als de te gebruiken opslagklasse. Met uitzondering van rowid (zie 3) hierboven) kan elke kolom waarden van elk type bevatten.

Met uitzondering van gegevens die zijn opgeslagen als een Blob, die moeten worden opgehaald met behulp van de cursor.getBlob en dat cursor.getBlob niet kan worden gebruikt voor gegevens die niet zijn opgeslagen als een BLOB (getBlob faalt niet met gegevens die zijn opgeslagen als TEKST), U kunt heel veel gegevens ophalen (hoewel niet noodzakelijkerwijs nuttig) met behulp van een van de cursor.get???? methoden.

Hier zijn enkele voorbeelden:-

Voor een kolom waar de gegevens long myINT = 556677888; wordt toegevoegd (via ContentValues ​​bijv. cv1.put(columnanme,myINT) );

Dan:-

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 keert niet terug naar de opgeslagen waarde, getBlob kan de opgeslagen waarde niet ophalen.

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

En hier is een behoorlijk belachelijk voorbeeld met een kolomtype van my_char_is_not_a_char_but_an_int volgens 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 (opgeslagen volgens 'Double' hierboven) zijn:-

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.

Het bovenstaande was gebaseerd op het volgende:-Datatypes in SQLite versie 3 SQLite Autoincrement PRAGMA-statements

Code is getest/uitgevoerd op een door GenyMotion geëmuleerd apparaat met API22, gecompileerd met een minimale versie van 14 en doel van 26.




  1. Ignition verbinden met Microsoft Access

  2. Bestel een MySQL-tabel met twee kolommen

  3. Dapper gebruiken met Oracle-opgeslagen procedures die cursors retourneren

  4. Wat betekent het als MySQL zich in de staat Gegevens verzenden bevindt?