Introdução aos tipos de dados em SQL
Ao contrário do JavaScript, o SQL tem tipagem forte. Em cada tabela, cada coluna tem seu próprio tipo de dados fixo.
Existem muitos tipos de dados, mas, ao contrário da linguagem Java, existem muitos deles, não porque existem tipos de dados para todas as ocasiões. Os bancos de dados são muito dependentes do tamanho dos dados; portanto, muitos tipos de dados diferem uns dos outros apenas no comprimento.
No total, os tipos de dados podem ser divididos em 5 grupos:
- tipos numéricos
- Tipos de string
- Tipos para armazenar datas e horas
- Objetos: geralmente representados como uma coleção de bytes
- Transporte : JSON e XML
Geralmente diferentes DBMS ainda possuem seus próprios tipos de dados. Cada DBMS tem sua própria especialização, então adicionar novos tipos de dados é algo muito comum.
Outra coisa é que apenas adicionar um novo tipo de dados não é suficiente, você precisa adicionar funções que funcionem com ele, além de tornar esse trabalho conveniente e rápido.
Se você trabalha em qualquer DBMS industrial (empresarial), provavelmente terá que lidar com seus tipos de dados e suas funções. Para o que será necessário ler 2-5 bons livros.
Como parte de nosso conhecimento do SQL, consideraremos três grupos principais de tipos de dados:
- Números
- Cordas
- datas
Tipos Numéricos em SQL
No SQL, os tipos numéricos são divididos em três grupos:
- Tipos inteiros
- Números de ponto fixo (número fixo de casas decimais)
- Números de ponto flutuante
Vamos começar com números inteiros . Existem apenas 5 deles e podem ser descritos em uma tabela:
# | Digite o nome | Comprimento em bytes | Analógico de Java | valor mínimo | Valor máximo |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | SMALLINT | 2 | curto | -32.768 | 32.767 |
3 | MEDIUMINT | 3 | -8.388.608 | 8.388.607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | BIGINT | 8 | longo | -2 63 | 2 63-1 |
Os tipos de dados são muito semelhantes aos tipos de dados Java, mas também há um tipo inteiro com três bytes de comprimento. Isso é feito para economizar no tamanho.
Em seguida vêm os tipos de ponto flutuante , assim como em Java, existem apenas dois deles:
# | Digite o nome | Comprimento em bytes | Analógico de Java | valor mínimo | Valor máximo |
---|---|---|---|---|---|
1 | FLUTUADOR | 4 | flutuador | -3,40E+38 | +1,18E+38 |
2 | DOBRO | 8 | dobro | -1,79E+308 | +1,79E+308 |
Novamente, nada de novo. Tudo é o mesmo que em Java. No entanto, ao contrário do Java, o SQL tem outro tipo especial, o número real de ponto fixo. Chama-se DECIMAL.
Normalmente, esse tipo é usado para armazenar quantias de dinheiro. Quando o nome desse tipo é escrito, depois dele geralmente é indicado quantas casas decimais o número tem antes e depois da vírgula. O formato geral é assim:
DECIMAL(total_characters, after_comma)
E um pequeno exemplo:
salary DECIMAL(5,2)
É assim que descrevemos o fato de que a coluna de salário pode conter números inteiros (máximo de 3 casas decimais) e uma parte fracionária - 2 casas decimais.
O número máximo de caracteres que o tipo DECIMAL suporta é 65.
Tipos de string em SQL
As linhas em um banco de dados podem ser armazenadas de duas formas:
- Sequências de comprimento fixo
- Strings com comprimento variável
Strings de comprimento fixo são especificadas como CHAR :
CHAR(length)
Comprimento fixo significa que todos os valores desta coluna conterão um número estritamente fixo de caracteres.
Um exemplo de string de comprimento fixo:
country_code CHAR(2)
Strings de comprimento variável são especificadas pelo tipo VARCHAR :
VARCHAR(max_length)
Comprimento variável significa que todos os valores desta coluna conterão texto de qualquer comprimento, mas não mais do que o comprimento máximo.
Exemplo de string de comprimento variável:
phone VARCHAR(12)
Strings de comprimento fixo têm uma vantagem muito grande. Se o cliente pediu ao servidor SQL para retornar a ele a linha 1.000.000 da tabela, e as linhas na tabela são de comprimento fixo, sabendo o comprimento da linha, você pode calcular facilmente os bytes relacionados ao desejado linha.
No caso de comprimento variável de linhas, não será possível localizar rapidamente a linha desejada na tabela. Lembre-se da velocidade de acesso a ArrayList e LinkedList, a situação é aproximadamente a mesma aqui.
Vamos comparar como strings de tamanhos diferentes serão armazenadas em uma tabela, dependendo do tipo de dados.
Linha | CAR(4) | Byte para armazenar | VARCHAR(4) | Byte para armazenar | |
---|---|---|---|---|---|
'' | '' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'abcd' | 'abcd' | 4 | 'abcd' | 5 | |
'abcdefgh' | 'abcd' | 4 | 'abcd' | 5 |
Observação. O tipo VARCHAR requer um byte a mais para o mesmo comprimento, porque ele deve armazenar adicionalmente o comprimento da string.
Tipos temporários em SQL
O SQL também possui tipos especiais para armazenar datas e horas. Existem cinco tipos no total:
# | Digite o nome | Analógico da API Java DateTime | Exemplo | valor mínimo | Valor máximo |
---|---|---|---|---|---|
1 | DATA | LocalData | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | TEMPO | Horário local | 'hh:mm:ss[.fração]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATA HORA | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | TIMESTAMP | Data | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | ANO | 1901 | 2155 |
Todos os dados nas consultas são escritos como uma string - entre aspas simples. O formato de entrada vai do maior para o menor:
- Ano
- Mês
- Dia
- Hora
- Minuto
- Segundo
- Frações de segundo
Os tipos DATE, TIME e DATETIME podem ser convencionalmente considerados análogos dos tipos da API Java DateTme: LocalDate, LocalTime, LocalDateTime. A lógica é quase a mesma.
O tipo TIMESTAMP armazena dados em milissegundos desde o início de 1970 (um padrão do sistema operacional UNIX). É desta forma que eles são armazenados pelo tipo Date na linguagem Java.
E, finalmente, existe o tipo YEAR, que tem 1 byte e armazena valores de 1 a 255. Portanto, o intervalo de anos disponível para ele é 1901-2155. O ano 1900 não pode ser armazenado por este tipo, pois o valor 0 é usado para codificar um valor NULL.
Armazenando objetos em SQL
Existem tipos especiais para armazenar objetos ou textos de grande extensão. Não vamos entrar em detalhes sobre eles, mas vou listá-los de qualquer maneira:
# | Digite o nome | Explicação |
---|---|---|
1 | TEXTO | Usado para armazenar textos longos. Ao comparar e classificar neste campo, apenas os primeiros 100 caracteres são usados. |
2 | BLOB | O nome significa Byte Large Object. Armazenado apenas como uma coleção de bytes. Pode ser usado para, por exemplo, armazenar imagens em um banco de dados. |
3 | CLOB | O nome significa Char Large Object. Usado para armazenar textos longos. |
4 | ENUM | Permite definir um conjunto fixo de valores e armazenar um deles como um valor. |
5 | DEFINIR | Permite definir um conjunto fixo de valores e armazenar qualquer subconjunto deles como um valor. Geralmente os armazena como uma máscara binária. |
Teoricamente, você pode serializar qualquer objeto Java como um conjunto de bytes e armazená-lo no banco de dados como um BLOB. Salvar o objeto não é um problema. Como trabalhar com ele ainda mais?
Digamos que uma tabela armazene um milhão de objetos em forma serializada - como você os pesquisará? Um SGBD suporta apenas um determinado tipo de dados quando fornece um amplo conjunto de funções para trabalhar com ele.