SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Quão flexíveis/restritivos são os tipos de coluna SQLite?


Os tipos de coluna SQLite são flexíveis (dinâmicos), principalmente, parecem atender à adoção/adaptação de tipos de coluna rígidos usados ​​por outros sistemas de gerenciamento de banco de dados.

Observação! este Asnwer NÃO recomenda o uso de tipos de coluna estranhos e maravilhosos.

1) Na verdade, você pode usar praticamente qualquer nome para um tipo de coluna, no entanto, existem algumas limitações.

2) O tipo de coluna é o 2º valor na definição da coluna, por exemplo CREATE TABLE table (columnname columntype .....,....) , embora possa ser omitido intencionalmente ou talvez inadvertidamente Observação, consulte 5a)

3) A primeira limitação é que mycolumn CHAVE PRIMÁRIA INTEIRO ou mycolumn INCREMENTO AUTOMÁTICO DE CHAVE PRIMÁRIA INTEIRO é um tipo de coluna especial. A coluna é um alias para o rowid que é um identificador numérico exclusivo (AUTOINCREMENT impõe uma regra que o rowid deve ser maior que o último rowid usado para a tabela, por exemplo. se uma linha usar id (9223372036854775807), qualquer tentativa subsequente de adicionar uma linha resultará em um erro SQLITE FULL. ). Autoincremento SQLite

4) Outras limitações são que o tipo de coluna não deve confundir o analisador SQLite. Por exemplo, um tipo de coluna PRIMARY, TABLE, INDEX resultará em uma exceção SQLite (erro de sintaxe (código 1) ) por exemplo. quando um tipo de coluna de INDEX é usado, então:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):

ocorre.

5) Um tipo de coluna não é obrigatório, por exemplo CREATE TABLE mytable (...,PRIMARY_COL,.... nesse caso, um PRAGMA TABLE_INFO(tablename) não mostrará nenhum tipo, por exemplo (3ª Linha).
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) Em alguns casos, o SQLite Parser pulará para PALAVRAS-CHAVE válidas, por exemplo. CREATE TABLE mytable (mycolumn NOT NULL,... resulta em NOT NULL sendo usado para indicar um NOT NULL coluna e o tipo sendo considerado como sem tipo (o table_info acima foi realmente de tal uso).

6) Um tipo não está limitado a uma única palavra, por exemplo CARACTERES VARIADOS(255) ou O LOBO RUIM pode ser especificado como um tipo, como pode ser visto neste extrato table_info:-
08-08 08:23:26.423 4799-4799/? D/   TBLINFO: Col=type Value=THE BIG BAD WOLF

O motivo para usar tipos de coluna não padrão no SQLite!


Resumindo, não Por isso, como afirmado no início, a flexibilidade dos tipos de coluna parece ser principalmente para atender à fácil adaptação do SQL de outros sistemas de gerenciamento de banco de dados.

Os próprios tipos de coluna têm pouco efeito, pois os dados serão armazenados de acordo com o que o SQLite determina como a classe de armazenamento a ser usada. Com exceção de rowid (consulte 3) acima) qualquer coluna pode conter valores de qualquer tipo.

Com exceção dos dados armazenados como um Blob, que devem ser recuperados usando o cursor.getBlob e esse cursor.getBlob não pode ser usado para dados não armazenados como BLOB (getBlob não falha com dados armazenados como TEXT). .get???? métodos.

Aqui estão alguns exemplos:-

Para uma coluna onde os dados long myINT =556677888; é adicionado (via ContentValues, por exemplo, cv1.put(columnanme,myINT) );

Então :-
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 não retorna ao valor armazenado, getBlob não pode obter o valor armazenado.

Para 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.

Para String myTEXT ="A raposa marrom rápida e preguiçosa pulou a cerca ou algo assim.";
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]<<

E aqui está um exemplo bem ridículo com um tipo de coluna de my_char_is_not_a_char_but_an_int conforme 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

Os resultados (armazenados conforme 'Double' acima) são:-
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.

O acima foi baseado no seguinte:- Tipos de dados no SQLite versão 3 SQLite Autoincrement instruções PRAGMA

O código foi testado/executado em um dispositivo emulado GenyMotion executando API22 compilado com uma versão mínima de 14 e destino de 26.