SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Seberapa fleksibel/restriktif tipe kolom SQLite?

Jenis kolom SQLite fleksibel (dinamis), terutama, tampaknya memenuhi adopsi/adaptasi jenis kolom kaku yang digunakan oleh Sistem Manajemen basis data lainnya.

Perhatikan! Jawaban ini TIDAK merekomendasikan penggunaan jenis kolom yang aneh dan indah.

1) Anda sebenarnya dapat menggunakan hampir semua nama untuk jenis kolom, namun ada beberapa batasan.

2) Jenis kolom adalah nilai ke-2 dalam definisi kolom mis. CREATE TABLE table (columnname columntype .....,....) , meskipun mungkin dihilangkan dengan sengaja atau mungkin tidak sengaja Catatan lihat 5a)

3) Batasan pertama adalah mycolumn INTEGER PRIMARY KEY atau mycolumn INTEGER PRIMARY KEY AUTOINCREMENT adalah jenis kolom khusus. Kolom adalah alias untuk rowid yang merupakan pengidentifikasi numerik unik (AUTOINCREMENT memberlakukan aturan bahwa rowid harus lebih besar dari rowid yang terakhir digunakan untuk tabel mis. jika sebuah baris menggunakan id (9223372036854775807), maka setiap upaya berikutnya untuk menambahkan baris akan menghasilkan kesalahan SQLITE FULL. ). Peningkatan Otomatis SQLite

4) Keterbatasan lainnya adalah bahwa jenis kolom tidak boleh membingungkan pengurai SQLite. Misalnya jenis kolom PRIMARY, TABLE, INDEX akan menghasilkan pengecualian SQLite (kesalahan sintaks (kode 1) ) misalnya ketika jenis kolom INDEX digunakan maka:-

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

terjadi.

5) Jenis kolom tidak wajib, misalnya CREATE TABLE mytable (...,PRIMARY_COL,.... dalam hal ini PRAGMA TABLE_INFO(tablename) tidak akan menunjukkan tipe mis. (Baris ke-3).

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) Dalam beberapa kasus, Parser SQLite akan melompat ke KATA KUNCI yang valid mis. CREATE TABLE mytable (mycolumn NOT NULL,... menghasilkan NOT NULL digunakan untuk menunjukkan NOT NULL kolom dan jenis dianggap sebagai tidak ada tipe (tabel_info di atas sebenarnya dari penggunaan seperti itu).

6) Jenis tidak terbatas pada satu kata, mis. VARYING CHARACTER(255) atau THE BIG BAD WOLF dapat ditentukan sebagai tipe seperti yang dapat dilihat dari ekstrak table_info ini :-

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

Alasan untuk menggunakan tipe kolom non-standar di SQLite!

Singkatnya tidak ada tidak alasan, seperti yang dinyatakan di awal, fleksibilitas jenis kolom tampaknya terutama untuk memenuhi adaptasi SQL yang mudah dari Sistem Manajemen Basis Data lainnya.

Jenis kolom sendiri tidak banyak berpengaruh karena data akan disimpan sesuai dengan apa yang ditentukan SQLite sebagai kelas penyimpanan yang akan digunakan. Dengan pengecualian rowid (lihat 3) di atas) kolom apa pun dapat menampung nilai jenis apa pun.

Dengan pengecualian data yang disimpan sebagai Blob, yang harus diambil menggunakan cursor.getBlob dan cursor.getBlob itu tidak dapat digunakan untuk data yang tidak disimpan sebagai BLOB (getBlob tidak gagal dengan data yang disimpan sebagai TEXT), Anda dapat mengambil banyak data (semuanya belum tentu berguna) menggunakan salah satu cursor.get???? metode.

Berikut beberapa contohnya:-

Untuk kolom dimana data long myINT = 556677888; ditambahkan (melalui ContentValues ​​mis. cv1.put(columnanme,myINT) );

Kemudian :-

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 tidak mengembalikan nilai yang disimpan, getBlob tidak bisa mendapatkan nilai yang disimpan.

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

Dan inilah contoh yang cukup konyol dengan jenis kolom my_char_is_not_a_char_but_an_int sesuai 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

Hasil (disimpan sesuai 'Ganda' di atas) adalah:-

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.

Di atas didasarkan pada yang berikut:-Tipe data Dalam SQLite Versi 3 Pernyataan PRAGMA SQLite Autoincrement

Kode diuji/dijalankan pada perangkat emulasi GenyMotion yang menjalankan API22 yang dikompilasi dengan versi minimum 14 dan target 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. Sintaks kueri SQLite yang disempurnakan di Android

  2. Tidak dapat mengikat argumen pada indeks 2 karena indeks di luar jangkauan

  3. Menggunakan SQLCipher dengan Android

  4. SQLiteDatabase android IllegalStateException

  5. SQLite AVG