No SQLite, a seguinte instrução seria bem-sucedida e a cadeia seria inserida / atualizada na SALARY
coluna do tipo INTEGER
:
update employee set salary='TOO MUCH' where emp_id=1;
Observe que zero não será inserido / atualizado, mas a sequência "MUITO" real , portanto, não se trata de conversão de tipos automáticos.
O FAQ declara:
Este é um recurso , não um bug. SQLite usa digitação dinâmica. Não impõe restrições de tipo de dados. Dados de qualquer tipo podem (geralmente) ser inseridos em qualquer coluna. Você pode colocar seqüências de caracteres arbitrárias em colunas inteiras, números de ponto flutuante em colunas booleanas ou datas em colunas de caracteres. O tipo de dados que você atribui a uma coluna no comando CREATE TABLE não restringe os dados que podem ser colocados nessa coluna. Cada coluna é capaz de conter uma cadeia de comprimento arbitrária. (Há uma exceção: as colunas do tipo INTEGER PRIMARY KEY podem conter apenas um número inteiro assinado de 64 bits. Ocorrerá um erro se você tentar colocar algo diferente de um número inteiro em uma coluna INTEGER PRIMARY KEY.)
Portanto, esse comportamento é claramente intencional, no entanto, eu me pergunto por que o SQLite tem esse comportamento, já que a maioria dos outros bancos de dados SQL que eu conheço se comporta de maneira bastante diferente, eles gerariam um erro ou converteriam a cadeia 0, ao tentar inserir uma cadeia não numérica em uma coluna numérica.
A biblioteca SQLite seria menos útil sem esse comportamento?
Isso foi feito por design para manter a biblioteca pequena e rápida?
A biblioteca SQLite seria significativamente mais lenta ou maior para gerar erros ao tentar inserir uma string em uma coluna numérica?
Respostas:
Não, a digitação dinâmica requer mais espaço de armazenamento e mais tempo de processamento, especialmente porque eles também adicionam afinidade de tipo, o que significa que ele possui um tipo preferido que o programador pode ignorar. É realmente um recurso intencional com custos reais de troca. Esses custos são efetivamente desprezíveis para os destinos de SQLite dos casos de uso, mas ainda estão lá.
É difícil perceber a utilidade desses recursos, porque você não está acostumado a disponibilizá-los. A solução alternativa para essa falta parece mais natural para você agora. Devido à sua experiência anterior, você está pensando nele como um campo INTEGER que nunca deve ser outra coisa, mas o SQLite o vê mais como um campo de qualquer tipo, mas provavelmente conterá números inteiros. Talvez seja um CEP para uma empresa que faz negócios principalmente nos EUA, mas tem um punhado de clientes canadenses. Permitir que o usuário especifique uma afinidade inteira economizará muito espaço, transformando-a em uma sequência em todas as linhas, mas ainda oferece essa opção.
fonte