AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 203220
Accepted
Manngo
Manngo
Asked: 2018-04-07 01:35:18 +0800 CST2018-04-07 01:35:18 +0800 CST 2018-04-07 01:35:18 +0800 CST

SQLite: Qual é a utilidade de especificar tipos de dados?

  • 772

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 TABLEinstrução?

sqlite datatypes
  • 3 3 respostas
  • 3200 Views

3 respostas

  • Voted
  1. screwtop
    2018-11-11T22:10:00+08:002018-11-11T22:10:00+08:00

    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 exemplo

    Some_Quantity real check (typeof(Some_Quantity) = 'real')
    

    Você perde a coerção automática de tipo, por exemplo, impediria que os valores '1'fossem 1armazenados em uma coluna real (você teria que especificá-la como 1.0). No entanto, você pode permitir vários tipos:

    Some_Quantity real check (typeof(Some_Quantity) in ('real', 'integer', 'null')
    

    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:

    Year check (typeof(Year) = 'integer' or Year in ('illegible', 'not disclosed'))
    
    • 11
  2. Timmmm
    2020-11-13T03:23:18+08:002020-11-13T03:23:18+08:00

    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:

    1. Documentação - pelo menos você sabe qual deve ser o tipo, mesmo que não seja aplicado.
    2. Suporte a ferramentas - os tipos de coluna podem ser lidos programaticamente, e ferramentas (por exemplo, SQLiteStudio) podem ser mais úteis se souberem os tipos.
    3. Interoperabilidade com outros bancos de dados - SQL não é realmente padrão e acho que a maioria das consultas só funciona em um banco de dados, mas se você vier a portar seu esquema para algum outro banco de dados, será muito menos trabalhoso se você tiver tipos especificados.

    Se você não se importa com isso, não faz sentido. Você pode impor os tipos usando CHECKrestrições, mas isso é independente do tipo de coluna real, portanto, não é realmente relevante para esta pergunta.

    • 4
  3. Best Answer
    Vérace
    2018-04-07T02:40:13+08:002018-04-07T02:40:13+08:00

    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.

    No entanto, a tipagem dinâmica no SQLite permite que ele faça coisas que não são possíveis em bancos de dados tradicionais rigidamente tipados.

    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:

    Uma classe de armazenamento é mais geral que um tipo de dados.

    Outra razão:

    No SQLite, o tipo de dados de um valor está associado ao próprio valor, não ao seu contêiner. O sistema de tipos dinâmicos do SQLite é compatível com os sistemas de tipos estáticos mais comuns de outros mecanismos de banco de dados, no sentido de que as instruções SQL que funcionam em bancos de dados estaticamente tipados devem funcionar da mesma maneira no SQLite.

    Também:

    E assim, na maior parte, "classe de armazenamento" é indistinguível de "tipo de dados" e os dois termos podem ser usados ​​de forma intercambiável.

    NB "na maioria das vezes ..."

    Para maximizar a compatibilidade entre o SQLite e outros mecanismos de banco de dados, e para que o exemplo acima funcione no SQLite como em outros mecanismos de banco de dados SQL, o SQLite suporta o conceito de "afinidade de tipo" nas colunas. A afinidade de tipo de uma coluna é o tipo recomendado para dados armazenados nessa coluna. A ideia importante aqui é que o tipo é recomendado, não obrigatório.

    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:

    Uma coluna com afinidade REAL se comporta como uma coluna com afinidade NUMERIC, exceto que força valores inteiros na representação de ponto flutuante. (Como uma otimização interna, pequenos valores de ponto flutuante sem componente fracionário e armazenados em colunas com afinidade REAL são gravados no disco como números inteiros para ocupar menos espaço e são automaticamente convertidos de volta em ponto flutuante à medida que o valor é lido. a otimização é completamente invisível no nível SQL e só pode ser detectada examinando os bits brutos do arquivo de banco de dados.)

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

    • 3

relate perguntas

  • Obter registros entre o intervalo de tempo

  • INT(5) vs SMALLINT(5): números entre parênteses após o tipo numérico

  • Usando CoreData em um aplicativo do lado do cliente

  • Limites do SQLite

  • É possível usar o SQLite como um banco de dados cliente-servidor? [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve