Ao criar uma tabela em SQLite3, fico confuso ao ser confrontado com todos os tipos de dados possíveis que implicam em conteúdos semelhantes, então alguém poderia me dizer a diferença entre os seguintes tipos de dados?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Existe alguma documentação em algum lugar que lista o mín. / Máx. capacidades dos vários tipos de dados? Por exemplo, acho que smallint
contém um valor máximo maior que tinyint
, mas um valor menor que inteiro, mas não tenho ideia de quais são essas capacidades.
DATE
ouBOOLEAN
, mas eu não me incomodaria em distinguir entre diferentes tamanhos de inteiros. Isso é especialmente verdadeiro para o caso deINTEGER PRIMARY KEY
, o único caso em que o nome do tipo exato é importante.A diferença é o açúcar sintático. Apenas algumas substrings dos nomes de tipo importam no que diz respeito à afinidade de tipo.
As regras para determinar a afinidade estão listadas no site SQLite .
Se você insiste na digitação estrita, pode implementá-la com
CHECK
restrições:Mas nunca me preocupo com isso.
Quanto à capacidade de cada tipo:
INTEGER
é sempre assinado de 64 bits. Observe que o SQLite otimiza o armazenamento de pequenos inteiros nos bastidores, então TINYINT não seria útil de qualquer maneira.REAL
é sempre de 64 bits (double
).TEXT
eBLOB
têm um tamanho máximo determinado por uma macro de pré-processador, cujo padrão é 1.000.000.000 bytes.fonte
TYPEOF
. Portanto, as tentativas de inserir um TEXTO que de outra forma seria convertido para a classe de armazenamento NUMERIC / INTEGER pelo SQlite (ou seja, tal conversão é sem perdas de acordo com sqlite.org/datatype3.html#affinity ) falhariam. Em outras palavras, essa abordagem é mais rígida do que a abordagem ad-hoc de inserir o valor e, então, de alguma forma validar magicamente a classe de armazenamento usada para armazenar esse valor pelo SQLite. Para uma abordagem mais permissiva, veja minha resposta abaixo.A maioria deles existe para compatibilidade. Você realmente só tem integer, float, text e blob. As datas podem ser armazenadas como um número (o tempo unix é inteiro, o tempo microsoft é flutuante) ou como texto.
fonte
NULL
. O valor é um valor NULL.INTEGER
. O valor é um número inteiro com sinal, armazenado em 1, 2, 3, 4, 6 ou 8 bytes dependendo da magnitude do valor.REAL
. O valor é um valor de ponto flutuante, armazenado como um número de ponto flutuante IEEE de 8 bytes.TEXT
. O valor é uma string de texto, armazenada usando a codificação do banco de dados (UTF-8, UTF-16BE ou UTF-16LE).BLOB
. O valor é um blob de dados, armazenado exatamente como foi inserido.fonte
Como um complemento à resposta de dan04, se você deseja inserir cegamente um
NUMERIC
diferente de zero representado por um,TEXT
mas certifique-se de que o texto seja conversível em um numérico:O caso de uso típico é em uma consulta de um programa que trata todos os dados como texto (para uniformidade e simplicidade, uma vez que o SQLite já faz isso). O bom disso é que permite construções como esta:
o que é conveniente no caso de você estar usando espaços reservados, porque você não precisa lidar com esses campos numéricos diferentes de zero especialmente. Um exemplo de uso do
sqlite3
módulo Python seria,No exemplo acima, todos os valores em
str_value_tuple
terão escape e serão colocados entre aspas como strings quando passados para SQlite. No entanto, como não estamos verificando explicitamente o tipo via,TYPEOF
mas apenas a conversibilidade para o tipo , ele ainda funcionará como desejado (ou seja, o SQLite irá armazená-lo como um numérico ou falhará caso contrário).fonte