Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Uma introdução aos tipos de dados MySQL


Introdução


Um dos principais recursos dos bancos de dados relacionais em geral é a capacidade de definir esquemas ou estruturas de tabela que especificam exatamente o formato dos dados que eles conterão. Isso é feito prescrevendo as colunas que essas estruturas contêm junto com seu tipo de dados e quaisquer restrições.

Os tipos de dados especificam um padrão geral para os dados que eles aceitam e armazenam. Os valores devem seguir os requisitos que eles descrevem para serem aceitos pelo MySQL. Embora seja possível definir requisitos personalizados, os tipos de dados fornecem os blocos de construção básicos que permitem ao MySQL validar a entrada e trabalhar com os dados usando as operações apropriadas.

O MySQL inclui uma ampla variedade de tipos de dados que são usados ​​para rotular e validar que os valores estejam de acordo com os tipos apropriados. Neste guia, discutiremos os tipos de dados mais comuns disponíveis no MySQL, os diferentes formatos de entrada e saída que eles usam e como configurar vários campos para atender às necessidades de seus aplicativos.

Quais são os tipos de dados no MySQL?


Antes de entrar em detalhes, vamos ter uma visão ampla dos tipos de dados que o MySQL fornece.

O MySQL suporta uma gama razoável de tipos de dados adequados para vários tipos de dados simples e complexos. Esses incluem:
  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT
  • DECIMAL
  • NUMERIC
  • FLOAT
  • DOUBLE
  • BIT
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIME
  • YEAR
  • CHAR
  • VARCHAR
  • BINARY
  • VARBINARY
  • BLOB
  • TEXT
  • ENUM
  • SET
  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON
  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION
  • JSON

Abordaremos os mais comuns com mais profundidade ao longo deste guia.


Introdução aos tipos de dados MySQL


Ao começar com os tipos, é importante lembrar que os tipos sozinhos nem sempre são uma solução completa para validação de dados, mas um componente. Outras ferramentas de banco de dados, como restrições, também têm um papel a desempenhar na definição da correção. Ainda assim, os tipos de dados costumam ser a primeira linha de defesa contra dados inválidos.

Para muitos casos, os tipos gerais fornecidos pelo MySQL são apropriados para os tipos de dados que você armazenará. Por exemplo, embora você possa armazenar as coordenadas de um ponto geométrico em duas colunas numéricas diferentes, o point fornecido type é criado especificamente para armazenar e validar exatamente esse tipo de informação. Ao escolher os tipos, verifique se você está usando o tipo mais específico aplicável ao seu caso de uso.



Números e valores numéricos


O MySQL inclui uma variedade de tipos de dados numéricos adequados para diferentes cenários. O tipo apropriado depende da natureza exata dos valores que você planeja armazenar, bem como de seus requisitos de precisão.

Inteiros


O inteiro tipo de dados é uma categoria de tipos usados ​​para armazenar números sem frações ou decimais. Estes podem ser valores positivos ou negativos, e diferentes tipos inteiros podem armazenar diferentes intervalos de números. Tipos inteiros com intervalos menores de valores aceitáveis ​​ocupam menos espaço do que aqueles com intervalos mais amplos.

A lista básica de tipos inteiros inclui o seguinte:
Tipo inteiro Comprimento Intervalo assinado aplicável Intervalo não assinado aplicável
TINYINT 1 byte -128 a 127 0 a 255
SMALLINT 2 bytes -32768 a 32767 0 a 65535
MEDIUMINT 3 bytes -8388608 a 8388607 0 a 16777215
INT 4 bytes -2147483648 para 2147483647 0 a 4294967295
BIGINT 8 bytes -2^63 a -2^63-1 0 a 2^64-1

Os tipos acima são limitados por seu intervalo válido. Qualquer valor fora do intervalo resultará em um erro.

Além dos tipos mencionados acima, o MySQL também reconhece um alias chamado SERIAL . Marcando uma coluna como SERIAL fornecerá estas propriedades:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE . Isso é usado como um atalho para propriedades comuns de coluna de chave primária. A coluna atribuirá automaticamente um novo valor exclusivo sempre que um registro for adicionado.


Ponto fixo


Os tipos de pontos fixos são usados ​​para controlar a quantidade de precisão ou especificidade possível para um número com decimais. No MySQL, isso pode ser controlado pela manipulação de dois fatores:precisão e escala.

Precisão é a quantidade máxima de dígitos totais que um número pode ter. Por outro lado, escala é o número de dígitos à direita da vírgula. Ao manipular esses números, você pode controlar o tamanho dos componentes fracionários e não fracionários de um número.

Esses dois argumentos são usados ​​para controlar a precisão arbitrária usando o numeric ou decimal tipos de dados (esses dois tipos são sinônimos no MySQL). O numeric type leva de zero a dois argumentos.

Sem argumentos, a coluna é definida como tendo uma precisão de 10 e uma escala de 0. Isso significa que a coluna pode conter até 10 dígitos, mas nenhum deles pode estar após o ponto decimal:
NUMERIC

Quando um único argumento é fornecido, ele é interpretado como a precisão da coluna com a escala definida como 0. Isso efetivamente permite especificar o número máximo de dígitos em um número inteiro (sem componentes fracionários ou decimais). Por exemplo, se você precisar de um número inteiro de 5 dígitos, poderá especificar:
NUMERIC(5)

Especifique a precisão seguida de escala ao configurar uma coluna usando os dois controles. O MySQL arredondará o componente decimal de qualquer entrada para o número correto de dígitos usando o número da escala. O MySQL usará a precisão e a escala para determinar quantos dígitos são permitidos no lado esquerdo do ponto decimal. Se uma entrada exceder o número permitido de dígitos, o MySQL produzirá um erro.

Por exemplo, podemos especificar uma coluna com uma precisão total de 5 e uma escala de 2:
NUMERIC(5, 2)

Esta coluna teria o seguinte comportamento:
Valor de entrada Valor arredondado Aceito (se ajusta à precisão)?
400.28080 400,28 Sim
8.332799 8,33 Sim
11799.799 11799,80 Não
11799 11799 Não
2802.27 2802.27 Não


Ponto flutuante


Os números de ponto flutuante são outra maneira de expressar números decimais, mas sem precisão exata e consistente. Em vez disso, os tipos de ponto flutuante têm apenas um conceito de precisão máxima que geralmente está relacionado à arquitetura e plataforma do hardware.

Por exemplo, para limitar uma coluna de ponto flutuante a 8 dígitos de precisão, você pode usar o FLOAT type, que armazena resultados usando 4 bytes com precisão de 0 a 23 dígitos:
FLOAT(8)

Da mesma forma, o DOUBLE type usa 8 bytes para armazenar dados e pode usar precisões de 24 a 53 dígitos.

Devido a essas opções de design, os números de ponto flutuante podem funcionar com números com grande número de decimais de forma eficiente, mas nem sempre exatamente. A representação interna de números pode causar pequenas diferenças entre a entrada e a saída. Isso pode causar um comportamento inesperado ao comparar valores, fazer cálculos de ponto flutuante ou executar operações que exigem valores exatos.


Ponto flutuante vs numérico


Ambos os números de ponto flutuante fornecidos por tipos como FLOAT e DOUBLE e números de pontos fixos fornecidos pelo NUMERIC ou DECIMAL tipos podem ser usados ​​para armazenar valores decimais. Como saber qual usar?

A regra geral é que, se você precisar de exatidão em seus cálculos, o NUMERIC tipo é sempre a melhor escolha. O NUMERIC type armazenará os valores exatamente como são fornecidos, o que significa que os resultados são totalmente previsíveis ao recuperar ou calcular valores. O NUMERIC tipo é chamado de precisão arbitrária porque você especifica a quantidade de precisão que o tipo requer e ele armazenará essa quantidade exata de dígitos no campo.

Por outro lado, tipos como FLOAT e DOUBLE são tipos de precisão variável. A quantidade de precisão que eles mantêm depende do valor de entrada. Quando atingem o fim do nível de precisão permitido, podem arredondar os dígitos restantes, levando a diferenças entre os valores enviados e recuperados.

Então, quando você usaria tipos de precisão variável? Tipos de precisão variável como FLOAT e DOUBLE são adequados para cenários em que os valores exatos não são necessários (por exemplo, se forem arredondados de qualquer maneira) e quando a velocidade é altamente valiosa. A precisão variável geralmente oferece benefícios de desempenho em relação ao NUMERIC tipo.



Tipos de string


Os tipos de caracteres e tipos de string do MySQL podem ser colocados em duas categorias:comprimento fixo e comprimento variável . A escolha entre esses dois afeta como o MySQL aloca espaço para cada valor e como ele valida a entrada.

O tipo de dados baseado em caracteres mais simples no MySQL é o char tipo. Sem argumentos, o char type aceita um único caractere como entrada:
CHAR

Quando um inteiro positivo é fornecido na declaração, o char A coluna armazenará uma cadeia de caracteres de comprimento fixo igual ao número de caracteres especificado:
CHAR(10)

Se uma string for fornecida com menos caracteres, serão acrescentados espaços em branco para preencher o comprimento:
Entrada Nº de caracteres de entrada Valor armazenado Nº de caracteres armazenados
'árvore' 4 'árvore      ' 10

Se uma string for fornecida com um número de caracteres maior que o permitido, o MySQL irá gerar um erro. Como exceção a esta regra, se os caracteres transbordantes forem todos espaços, o MySQL simplesmente truncará os espaços em excesso para caber no campo.

A alternativa aos campos de caracteres de comprimento fixo são campos de comprimento variável. Para isso, o MySQL fornece o varchar tipo. O varchar type armazena caracteres sem tamanho fixo. Ao contrário de char , varchar não pode ser usado sem especificar o número máximo de caracteres a serem armazenados.

Ao definir um varchar com um inteiro positivo, você pode definir um comprimento máximo de string:
VARCHAR(10)

Isso difere de usar o char digite com um inteiro nesse varchar não preencherá o valor se a entrada não atender ao comprimento máximo do campo:
Entrada Nº de caracteres de entrada Valor armazenado Nº de caracteres armazenados
'árvore' 4 'árvore' 4

Se a string for maior que o comprimento máximo, o MySQL lançará um erro. O mesmo comportamento de truncamento que está presente em char campos ocorre aqui:se os caracteres transbordantes forem espaços, eles serão truncados para caber dentro do comprimento máximo de caracteres.

O MySQL também suporta o binary e varbinary tipos de dados. Eles operam de maneira semelhante ao char e varchar tipos, mas armazena strings binárias em vez de strings de caracteres. Isso tem implicações em como eles são armazenados e operados (para coisas como comparações, classificação, etc.).

Para binary e varbinary tipos, o número inteiro fornecido ao definir o tipo de coluna representa o número de bytes em vez do número de caracteres.

Dois outros tipos de dados que o MySQL fornece para strings e armazenamento de caracteres são blob e text . Esses tipos operam de forma semelhante ao varchar e varbinary tipos respectivamente e destinam-se a armazenar objetos grandes. Eles operam basicamente da mesma forma que suas contrapartes, mas têm algumas diferenças, como não começar a ter valores padrão e exigir um comprimento de prefixo ao criar um índice.


Booleanos


O MySQL na verdade não possui um tipo booleano nativo para representar valores true e false.

MySQL reconhece os tipos BOOL ou BOOLEAN em um esforço para compatibilidade com outros sistemas de banco de dados. Sua implementação interna, no entanto, usa um TINYINT(1) coluna para armazenar os valores e os interpreta como verdadeiro ou falso com base em um conjunto de regras.

Ao interpretar valores numéricos em um contexto booleano, o valor de 0 é considerado falso. Todos os valores diferentes de zero são considerados verdadeiros.

MySQL reconhece os literais booleanos TRUE e FALSE e converte TRUE para 1 e FALSE para 0 ao armazená-los.


Datas e hora


O MySQL tem suporte para representar datas, horas e combinações dos dois.

Datas


A date type pode armazenar uma data sem um valor de tempo associado:
DATE

Ao processar a entrada para date colunas, o MySQL pode interpretar diferentes formatos para determinar a data correta a ser armazenada. No entanto, as partes componentes devem sempre vir na mesma sequência:ano, mês e depois dia. O STR_TO_DATE() está disponível para ajudar a converter outros formatos de data para um formato que o MySQL interpretará corretamente.

Ao exibir datas, o MySQL usa o YYYY-MM-DD formato. Você pode usar o DATE_FORMAT() função para formatar a saída em outros formatos.

A date tipo pode armazenar valores que variam de 1000-01-01 para 9999-12-31 .


Hora


A time tipo de dados pode armazenar uma hora específica do dia sem um fuso horário ou data associada.

Ao processar a entrada para time colunas, o MySQL pode interpretar vários formatos para determinar a hora correta de armazenar. Quando a entrada tem dois pontos, geralmente é interpretada como hh:mm:ss . Qualquer valor reduzido (usando apenas uma coluna) será interpretado como usando hh:mm . Quando a entrada não tem dois pontos, o tempo é processado para preencher primeiro o menor valor. Por exemplo, 1045 é tomado como 10 minutos e 45 segundos.

O MySQL também suporta segundos fracionários se um ponto decimal for fornecido. Ele armazena até 6 dígitos de precisão após o decimal. Valores em time as colunas podem variar de -838:59:59.000000 para 838:59:59.000000 .

Ao exibir valores de tempo, o MySQL usa o hh:mm:ss formato. Assim como as datas, uma função é fornecida, chamada TIME_FORMAT() para exibir valores de tempo usando outros formatos.



Timestamps e datetime


O MySQL pode representar timestamps, uma combinação de data e hora usada para representar um momento específico no tempo, em duas variações diferentes:usando o timestamp tipo e o datetime tipo.

O datetime tipo pode representar valores de 1000-01-01 00:00:00 para 9999-12-31 23:59:59 . Também pode incluir segundos fracionários de até seis dígitos semelhantes ao time tipo.

O timestamp tipo pode representar valores de 1970-01-01 00:00:01 UTC para 2038-01-19 03:14:07 UTC. Ele também pode lidar com segundos fracionários. Ao armazenar timestamp valores, todos os valores são convertidos do fuso horário fornecido para UTC para armazenamento e convertidos novamente para o fuso horário local na recuperação. O datetime tipo não faz isso.

Do MySQL 8.0.19 em diante, você pode incluir um deslocamento de fuso horário ao armazenar um timestamp para definir explicitamente o fuso horário para o valor armazenado. Você faz isso incluindo um valor após o componente de tempo, sem espaço para indicar o deslocamento. O intervalo de valores aceitos vai de -14:00 para +14:00 , que representa o deslocamento do valor armazenado do UTC.

Ao decidir se os valores de data e hora devem ser armazenados usando datetime ou timezone tipos, muitas vezes é útil separá-los pelo que eles são melhores.

Pense em datetime valores como uma data e hora específicas, em relação ao calendário e relógio onde quer que seja recuperado. Se uma pessoa for dormir às 23h, um datetime value pode representar esse valor, independentemente do fuso horário em que a pessoa está atualmente.

Por outro lado, timezone os valores são melhores para representar um momento específico no tempo que não seja ambíguo nos fusos horários. Para enviar um convite de videochamada, um timezone value seria capaz de garantir que a reunião ocorra ao mesmo tempo para todos, independentemente do fuso horário em que o participante esteja.


Outros tipos úteis


Junto com os tipos que abordamos com alguma profundidade acima, existem tipos adicionais que são úteis em cenários específicos. Vamos cobri-los brevemente para lhe dar uma ideia de como usá-los e quando eles podem ser úteis.

Tipos enumerados e definidos


Dois tipos relacionados que permitem aos usuários ditar os valores válidos para uma coluna são o enum e set tipos.

O enum type é um tipo de string que permite ao usuário definir uma coleção de valores válidos quando a coluna é criada. Qualquer valor que corresponda a um dos valores definidos é aceito e todos os outros valores são rejeitados. Isso funciona de forma semelhante a um menu suspenso em que uma escolha pode ser feita a partir de um conjunto específico de opções. Por exemplo, um enum chamado season pode ser criado com os valores winter , spring , summer , e autumn .

Para criar um enum coluna, especifique o tipo como enum , dando os valores possíveis como strings, separados por vírgulas, dentro de um conjunto de parênteses, assim:
season ENUM('winter', 'spring', 'summer', 'autumn')

Um tipo semelhante de tipo definido pelo usuário é o set tipo. Como o enum tipo, set tipos permitem que os usuários especifiquem valores válidos como strings na definição. A diferença entre esses dois tipos é que em um set , mais de um valor pode ser armazenado para cada registro.

Por exemplo, se você precisa de uma coluna para representar os dias da semana em que os voluntários estão disponíveis para trabalhar, você pode ter um set coluna assim:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')

Ao inserir valores para a availability coluna que acabamos de criar, você fornece uma única string com vírgulas separando todos os dias em que o voluntário está disponível. Por exemplo:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'

Para set tipos no MySQL, os valores duplicados na entrada são sempre removidos e na recuperação, os valores seguem a ordem usada no set definição independentemente da ordenação ao inserir na coluna.


JSON


MySQL suporta colunas em JSON usando o json tipo. Dados armazenados como json é armazenado em binário para execução e processamento mais rápidos para que o servidor não precise interpretar uma string para operar em JSON valores.
JSON

Para operar em JSON colunas, o MySQL fornece várias funções para trabalhar com valores dentro do documento.



Conclusão


Neste artigo, abordamos muitos dos tipos de dados mais comuns que são úteis ao trabalhar com bancos de dados MySQL. Existem tipos adicionais não abordados neste guia que são úteis para conhecer, mas representam um bom ponto de partida para a maioria dos casos de uso.

É importante usar o sistema de tipos adequadamente para que você possa controlar valores válidos e operar nos dados conforme o esperado. Existem armadilhas com as quais você pode se deparar se escolher um tipo não adequado para seus dados, portanto, pensar antes de se comprometer com um tipo de dados vale a pena na maioria dos casos.

Se você estiver usando o Prisma Client para trabalhar com seus bancos de dados MySQL, poderá encontrar um mapeamento entre alguns dos tipos comuns de MySQL e Prisma nos documentos de conectores de dados MySQL do Prisma.