Até onde sei, o SQLite não impõe tipos de dados de tabela definidos — ele tem tipagem dinâmica. Por exemplo, permite inserir strings em campos numéricos ou exceder o comprimento da string.
Se for esse o caso, qual é o sentido de definir tipos de dados na CREATE TABLE
instrução?
Além da resposta de Vérace:
Embora o SQLite não imponha classes de armazenamento como tipos de dados, você pode aplicar uma verificação de tipo mais rigorosa usando
typeof()
uma restrição, por exemploVocê perde a coerção automática de tipo, por exemplo, impediria que os valores
'1'
fossem1
armazenados em uma coluna real (você teria que especificá-la como1.0
). No entanto, você pode permitir vários tipos:A flexibilidade de tipo do SQLite também é útil para permitir valores de indicadores “fora de banda” que de outra forma não seriam válidos para o tipo da coluna:
A decisão duvidosa do SQLite de ignorar os tipos de coluna (eles chamam isso de "recurso"!) torna um pouco mais inútil especificá-los, mas ainda existem algumas razões para fazê-lo:
Se você não se importa com isso, não faz sentido. Você pode impor os tipos usando
CHECK
restrições, mas isso é independente do tipo de coluna real, portanto, não é realmente relevante para esta pergunta.Existem várias razões no SQLite para definir tipos de dados, ou como o SQLite os chama, "classes de armazenamento".
Se você ler esta página , ela fornecerá uma visão sobre a função e o raciocínio por trás dos tipos de dados SQLite. Em particular, as seguintes seções dessa página são interessantes.
Ou seja, como a linguagem de programação C, o SQLite permite que você faça coisas muito estúpidas porque também permite que você faça coisas muito inteligentes - compare C com Java e SQLite com outros RDBMSs, por exemplo.
e:
Outra razão:
Também:
NB "na maioria das vezes ..."
Portanto, uma razão muito boa para essa generalidade é a compatibilidade com praticamente todos os mecanismos do mercado - e se o padrão não combina com você, você pode alterar o código (licença de domínio público). Outra razão pela qual o SQLite é o RDBMS mais popular do mundo!
Mais uma dica interessante:
Portanto, uma coluna com afinidade REAL (em oposição a INTEGER) realmente faz uma diferença funcional nos resultados de uma consulta e/ou cálculo. Por exemplo, a string '456.567' (o SQLite armazena BLOBs e números como binários como qualquer outro mecanismo de banco de dados SQL) seria tratado como 456.567 para cálculos NUMERIC, mas nenhuma tentativa seria feita para coagir '6&%$$$#3' em qualquer tipo de NUMERIC.
Uma suposição importante que o SQLite faz é que o programador é o rei e não o motor! Se, por algum motivo, você deseja converter '6&%$$$#3' para um INTEGER, então você pode criar seu próprio algoritmo para isso, mas o SQLite assume que se você deseja tratar '6&%$$$# 3' como INTEGER, então você deve ter uma boa razão para fazer essa escolha!
Uma maneira sucinta de colocar isso é que o SQLite oferece ferramentas muito poderosas, mas como qualquer ferramenta poderosa, é preciso ter cautela e moderação. Basicamente, o SQLite diz "você é um adulto - se você quiser dar um tiro na cabeça com a pistola de pregos que eu lhe dei, vá em frente, mas não me culpe se você se machucar!".
Além da página SQLite, esses links também são úteis ( 1 , 2 ).