Conversão de Tipos de String e Numéricos no MySQL: CAST vs CONVERT Explicados com Exemplos Práticos

目次

1. Introdução

Ao operar um banco de dados com MySQL, você frequentemente encontrará situações como “dados que deveriam ser tratados como números são armazenados como tipo string” ou “cálculos e agregações não podem ser realizados enquanto os dados permanecem como string”. Por exemplo, dados importados de arquivos Excel ou CSV são frequentemente armazenados como VARCHAR ou CHAR, mesmo que representem valores numéricos. Nesses casos, operações como soma, média e comparação numérica podem não funcionar como esperado, dificultando a escrita de consultas SQL adequadas.

Por outro lado, há cenários em que dados numéricos precisam ser tratados como strings. Por exemplo, ao preencher um ID ou código com zeros à esquerda, ou ao concatenar dados numéricos com outras colunas para fins de exibição. Nesses casos, a conversão de tipos numéricos para tipos string torna‑se necessária.

Dessa forma, “conversão de tipo entre strings e números” é uma das habilidades fundamentais necessárias para manipular dados de forma flexível no MySQL. Ao usar a conversão de tipo adequadamente, você pode manter a integridade dos dados enquanto permite agregação e processamento flexíveis.

Neste artigo, explicaremos claramente como converter entre strings e números no MySQL, como usar essas técnicas de forma eficaz, e os erros comuns e boas práticas baseados em experiência real. Seja você um iniciante ou um desenvolvedor SQL experiente, este guia oferecerá valor prático.

2. Tipos de Conversão de Tipo no MySQL

O MySQL oferece vários recursos convenientes para converter tipos de dados. Nesta seção, explicaremos dois padrões principais: “conversão de tipo explícita” e “conversão de tipo implícita”, juntamente com seus métodos representativos.

2.1 Conversão de Tipo Explícita

Conversão de tipo explícita significa especificar claramente no SQL que “este valor deve ser convertido para um tipo específico”. As duas funções a seguir são comumente usadas.

Função CAST
CAST() é uma função SQL padrão que converte um valor para um tipo especificado. É amplamente usada no MySQL.

SELECT CAST('123' AS SIGNED);

Neste exemplo, a string '123' é convertida para um inteiro com sinal (SIGNED). Outros tipos conversíveis incluem UNSIGNED (inteiro sem sinal), DECIMAL (número de ponto fixo), CHAR (string) e DATE (data).

Função CONVERT
CONVERT() é outra função usada para converter valores para diferentes tipos de dados. A sintaxe é a seguinte.

SELECT CONVERT('456', UNSIGNED);

Neste exemplo, a string '456' é convertida para um inteiro sem sinal (UNSIGNED). A principal diferença em relação ao CAST() é que CONVERT() também pode ser usado para conversão de conjunto de caracteres.

2.2 Conversão de Tipo Implícita

Conversão de tipo implícita é um mecanismo onde o MySQL converte automaticamente os tipos de dados ao executar operações ou comparações.

Por exemplo, ao somar um número e uma string, o MySQL converte automaticamente a string para um valor numérico.

SELECT 1 + '2';
-- Result: 3

Da mesma forma, ao concatenar valores numéricos como strings:

SELECT CONCAT(10, ' apples');
-- Result: '10 apples'

A conversão de tipo implícita é conveniente, mas pode gerar resultados inesperados. Portanto, para lógica complexa ou processos críticos, recomenda‑se fortemente o uso de conversão de tipo explícita.

3. Exemplos Práticos: Convertendo Strings em Números

No MySQL, quando valores numéricos são armazenados como strings (como CHAR ou VARCHAR), você não pode realizar cálculos ou comparações numéricas de forma confiável. Para agregar e analisar esses dados corretamente, é necessário converter as strings em tipos numéricos. Esta seção apresenta os métodos de conversão mais usados e as principais precauções.

3.1 Conversão com a Função CAST

A abordagem mais básica é usar a função CAST(). Por exemplo, para converter a string '100' em um inteiro, escreva o seguinte:

SELECT CAST('100' AS SIGNED) AS numeric_result;
-- Result: 100 (integer)

Use SIGNED para inteiros com sinal e UNSIGNED para inteiros sem sinal. Para dados decimais, você também pode usar DECIMAL ou FLOAT.

SELECT CAST('123.45' AS DECIMAL(10,2)) AS decimal_result;
-- Result: 123.45

3.2 Convertendo com a Função CONVERT

A função CONVERT() pode ser usada quase da mesma forma:

SELECT CONVERT('200', SIGNED) AS converted_result;
-- Result: 200

Ambos produzem o mesmo resultado, mas como CAST() é SQL padrão e oferece melhor portabilidade, geralmente é recomendado quando houver dúvidas.

3.3 Conversão Implícita via Aritmética

Quando você realiza operações aritméticas com tipos numéricos e de string em expressões SQL, o MySQL converte automaticamente a string em um número. Por exemplo:

SELECT '50' + 25 AS total;
-- Result: 75

Você também pode aplicar esse comportamento a funções de agregação. Por exemplo, se você passar uma coluna do tipo string para SUM(), o MySQL tenta a conversão numérica automaticamente e soma os valores:

SELECT SUM(amount) FROM sales_data;
-- Even if the amount column is VARCHAR, MySQL will attempt numeric summation

3.4 Cuidado com Strings com Zeros à Esquerda e Valores Não Numéricos

Strings com zeros à esquerda (por exemplo, '000100') também podem ser convertidas em números:

SELECT CAST('000100' AS SIGNED) AS converted_result;
-- Result: 100

No entanto, tenha cuidado se a string contiver caracteres não numéricos. Se você converter algo como CAST('abc123' AS SIGNED), e não houver caracteres numéricos no início, o MySQL retornará 0. Dependendo da qualidade dos dados, é importante realizar validação de entrada antes da conversão.

3.5 Casos de Uso Reais Comuns

  • Agregar dados de vendas ou valores que se tornaram strings devido a importações de Excel/CSV
  • Ordenar IDs armazenados como strings (mesmo que representem números) em ordem numérica
  • Ordenar strings de data armazenadas no formato YYYYMMDD por ordem de data (explicado mais adiante)

4. Exemplos Práticos: Convertendo Números em Strings

No MySQL, há muitos casos em que você deseja tratar dados numéricos como strings. Exemplos típicos incluem exibir IDs ou códigos com preenchimento de zeros, ou construir mensagens concatenando valores numéricos com outro texto. Esta seção apresenta métodos representativos e casos de uso práticos.

4.1 Convertendo com a Função CAST

Para converter explicitamente um tipo numérico (como INT ou DECIMAL) em um tipo string, use CAST():

SELECT CAST(123 AS CHAR) AS string_result;
-- Result: '123'

Com este método, você pode concatenar facilmente colunas numéricas com outras strings.

4.2 Convertendo com a Função CONVERT

Você também pode fazer o mesmo com CONVERT():

SELECT CONVERT(456, CHAR) AS converted_result;
-- Result: '456'

Há pouca diferença em relação ao CAST(), mas sob a perspectiva do SQL padrão, o CAST() é ligeiramente preferido.

4.3 Conversão Implícita via Concatenação

Ao concatenar números e strings usando funções como CONCAT(), o MySQL converte automaticamente os números em strings.

SELECT CONCAT(2024, ' year') AS fiscal_year_display;
-- Result: '2024 year'

Essa conversão implícita é comumente usada para saída de relatórios rotineiros e formatação de dados.

4.4 Casos de Uso Reais Comuns

  • Gerando IDs com zeros à esquerda Para exibir um ID numérico em 5 dígitos, combine-o com LPAD() da seguinte forma: SELECT LPAD(CAST(id AS CHAR), 5, '0') AS zero_padded_id FROM users; -- Se id=7, o resultado é '00007'
  • Concatenando datas ou valores em strings SELECT CONCAT('The total amount is ', CAST(total AS CHAR), ' yen.') AS message FROM orders; -- Se total=1500, o resultado é 'The total amount is 1500 yen.'

4.5 Notas

Mesmo que a string convertida pareça visualmente a mesma, o comportamento de “ordenação” e “operações de comparação” muda.
Por exemplo, ao ordenar como strings, '20' pode aparecer antes de '100' (ordem lexicográfica). É importante escolher a abordagem dependendo do seu objetivo.

5. Casos de Uso Avançados com Conversão de Tipo

A conversão de tipo não se limita a transformações numéricas ou de string simples. Ela também pode ser aplicada em vários cenários práticos em sistemas do mundo real. Esta seção apresenta casos avançados comumente usados e suas considerações principais.

5.1 Comparando e Convertendo Strings no Formato de Data

Se o seu banco de dados armazena datas em formatos como YYYYMMDD como tipos numéricos ou de string, a comparação simples de strings pode nem sempre se comportar como esperado.

Nesses casos, converter o valor para um tipo numérico usando CAST() permite uma ordenação e comparação cronológica adequadas.

SELECT *
FROM events
ORDER BY CAST(event_date AS UNSIGNED);
-- Values such as '20240501', '20240502', etc. are sorted in date order

Você também pode combinar isso com a função REPLACE() para converter datas separadas por hífens como '2024-05-01' em inteiros.

SELECT CAST(REPLACE('2024-05-01', '-', '') AS UNSIGNED);
-- Result: 20240501

5.2 Ordenando Tipos ENUM ou Valores de Código Numericamente

Para tipos ENUM ou valores de código que representam significado numérico, você pode querer ordená‑los em ordem numérica ao invés de ordem lexicográfica. Convertendo‑os para tipos numéricos com CAST() antes da ordenação, você obtém uma ordenação intuitiva.

SELECT *
FROM products
ORDER BY CAST(product_code AS UNSIGNED);

5.3 Uso em Agregação e Formatação de Dados

Por exemplo, se os valores de vendas são armazenados como VARCHAR, você pode obter um total preciso convertendo‑os explicitamente dentro de SUM().

SELECT SUM(CAST(sales_amount AS SIGNED)) AS total_sales
FROM sales_data;

5.4 Prevenindo Problemas com Precisão e Seleção de Tipo

Para valores decimais ou numéricos grandes, converter para o tipo DECIMAL ajuda a preservar a precisão.

Escolher entre SIGNED e UNSIGNED também é importante, dependendo se valores negativos podem existir nos seus dados.

SELECT CAST('1234.567' AS DECIMAL(10, 3));
-- Result: 1234.567

5.5 Detectando Erros ou Dados Inválidos

Se a conversão resultar em valores inesperados NULL ou 0, isso pode indicar dados inválidos.

Por exemplo, se uma string não puder ser convertida em um número, CAST() pode retornar 0 ou NULL dependendo do modo SQL.

Nesses casos, verificar os resultados da conversão pode ajudar a identificar necessidades de limpeza ou validação de dados.

SELECT original, CAST(original AS SIGNED) AS converted
FROM test_data
WHERE CAST(original AS SIGNED) = 0 AND original <> '0';
-- Extract only data that cannot be properly converted to numeric values

6. Diferenças Entre CAST e CONVERT

Ao realizar conversão de tipo no MySQL, você normalmente usa a função CAST ou a função CONVERT. Embora pareçam semelhantes, há diferenças no uso e nas características. Esta seção explica essas diferenças e como escolher entre elas.

6.1 Diferenças Básicas

  • Função CAST Usa a sintaxe CAST(value AS type) para converter explicitamente um valor para o tipo especificado. Ela está definida no SQL padrão e funciona de forma semelhante em muitos sistemas de banco de dados. SELECT CAST('123' AS SIGNED);
  • Função CONVERT Usa a sintaxe CONVERT(value, type) para converter um valor para o tipo especificado. No MySQL, também pode ser usada para conversão de conjunto de caracteres. SELECT CONVERT('123', SIGNED); -- Conversão de tipo SELECT CONVERT('hello' USING utf8mb4); -- Conversão de conjunto de caracteres

6.2 Compatibilidade com SQL Padrão

Como o CAST faz parte do padrão internacional SQL, ele oferece melhor portabilidade para outros bancos de dados (como PostgreSQL, SQL Server e Oracle). Por outro lado, o CONVERT inclui extensões específicas do MySQL, particularmente para conversão de conjunto de caracteres, usando sintaxe como CONVERT(expr USING charset_name).

6.3 Como Escolher Entre Eles

  • Para conversão de tipo (números, strings, datas, etc.) Na maioria dos casos, usar CAST é a escolha mais segura. É SQL padrão, altamente portátil e adequado para futuras migrações de banco de dados.
  • Para conversão de conjunto de caracteres (por exemplo, sjis para utf8mb4) Você deve usar CONVERT(expr USING charset_name).
  • Para casos específicos do MySQL ou especiais CONVERT pode oferecer flexibilidade adicional, mas para propósitos gerais, comece com CAST e use CONVERT somente quando necessário.

6.4 Comparação de Exemplo

-- Type conversion using CAST (convert to integer)
SELECT CAST('456' AS SIGNED);

-- Type conversion using CONVERT
SELECT CONVERT('456', SIGNED);

-- Character set conversion using CONVERT
SELECT CONVERT('Hello' USING utf8mb4);

6.5 Notas Importantes

  • Se a conversão falhar, ambas as funções podem retornar NULL ou 0.
  • A conversão de conjunto de caracteres não pode ser feita com CAST.
  • O comportamento pode variar dependendo do modo SQL ou da versão do MySQL, portanto teste sempre em ambientes de desenvolvimento e produção.

7. Notas Importantes e Melhores Práticas

Ao usar conversão de tipos de string e numéricos no MySQL, há várias armadilhas potenciais a serem observadas. Esta seção apresenta melhores práticas para ajudar a prevenir problemas e garantir uso seguro e preciso.

7.1 Erros ou NULL/0 inesperado de Conversões Inválidas

Ao realizar conversão de tipo, se o valor de origem não estiver no formato correto, o MySQL pode retornar valores inesperados NULL ou 0.

SELECT CAST('abc' AS SIGNED) AS result;
-- Result: 0 (default MySQL behavior)

Como mostrado acima, converter uma string não numérica para um tipo numérico resulta em 0. Portanto, sempre verifique se os dados originais não contêm valores inválidos antes da conversão.

Dependendo das configurações do modo SQL, a conversão pode produzir um erro ou NULL. Sempre confirme a configuração do seu ambiente de produção.

7.2 Escolhendo Precisão e Tipos Signed/Unsigned

  • Para valores que contêm decimais, converta para DECIMAL ou FLOAT
  • Se valores negativos forem possíveis, use SIGNED; se os valores forem estritamente inteiros positivos, use UNSIGNED

Sempre selecione o tipo apropriado de acordo com as características dos seus dados.

7.3 Impacto nos Índices

Usar funções de conversão de tipo como CAST ou CONVERT nas cláusulas WHERE ou ORDER BY pode impedir o uso de índices, resultando em degradação de desempenho.

SELECT * FROM users WHERE CAST(user_id AS SIGNED) = 1000;
-- Even if user_id has an index, it is often not used

Para conjuntos de dados grandes ou consultas críticas de desempenho, é melhor unificar os tipos de coluna no design do esquema para evitar conversões desnecessárias.

7.4 Não Dependa Excessivamente da Conversão Implícita

A conversão implícita de tipo no MySQL é conveniente, mas pode levar a comportamentos indesejados. Para lógica importante, sempre use CAST ou CONVERT explícitos.

SELECT '100a' + 20;
-- Result: 100 (only the leading numeric portion is used)

Para evitar bugs sutis e inconsistências de dados, torne a conversão explícita um hábito.

7.5 Validar Tipos na Etapa de Entrada de Dados

Ao projetar seu banco de dados, armazene dados numéricos como tipos numéricos e dados de string como tipos de string. Minimizar a necessidade de conversão por meio de um design de esquema adequado é uma das maneiras mais eficazes de prevenir problemas.

8. Resumo

A conversão de tipos entre strings e números no MySQL é um tópico inevitável no processamento diário de dados, agregação e operações de sistema. Neste artigo, cobrimos tudo, desde o uso básico até técnicas avançadas e precauções importantes.

Para conversão de string para número, métodos explícitos como CAST e CONVERT estão disponíveis. Embora a conversão implícita seja frequentemente usada na prática, priorizar a conversão explícita melhora a confiabilidade e a qualidade dos dados. Por outro lado, a conversão de número para string também é amplamente utilizada para formatar IDs, códigos e gerar mensagens de saída.

Além disso, técnicas como aplicações relacionadas a datas, agregação e ordenação, e detecção de erros demonstram o quão poderosa a conversão de tipos pode ser em cenários do mundo real. No entanto, a conversão também traz armadilhas potenciais e impactos de desempenho. Sempre siga as melhores práticas discutidas acima.

Ao dominar a conversão de tipos corretamente, você pode expandir significativamente sua capacidade de manipular dados de forma eficaz no MySQL.
Esperamos que este artigo apoie seu trabalho diário e aprendizado.

9. FAQ (Perguntas Frequentes)

Q1. O que acontece se eu CAST uma string como ‘abc’ para um número?

No MySQL, ao tentar converter uma string para um tipo numérico (como SIGNED ou UNSIGNED), o MySQL retorna a parte numérica inicial, se houver; caso contrário, retorna 0.

SELECT CAST('abc' AS SIGNED); -- Result: 0
SELECT CAST('123abc' AS SIGNED); -- Result: 123

No entanto, dependendo do modo SQL (por exemplo, STRICT_TRANS_TABLES), o resultado pode ser um erro ou NULL.

Q2. Devo usar CAST ou CONVERT?

Para conversão de tipo geral (números, strings, datas, etc.), recomenda‑se usar CAST porque está em conformidade com o SQL padrão. Para conversão de conjunto de caracteres, você deve usar a função CONVERT com a cláusula USING. Escolha com base no seu caso de uso.

Q3. A conversão implícita de tipo é suficiente?

A conversão implícita pode funcionar para consultas pequenas ou testes, mas para agregação crítica e desenvolvimento de sistemas de produção, a conversão explícita (CAST ou CONVERT) é altamente recomendada. Escrever conversões explícitas ajuda a prevenir comportamentos inesperados e bugs.

Q4. O uso de conversão de tipo em WHERE ou ORDER BY desabilita índices?

Sim. Aplicar funções como CAST ou CONVERT a uma coluna pode impedir que o MySQL use índices definidos nessa coluna.
Se for necessária a consulta de alto desempenho em grandes conjuntos de dados, unifique os tipos de coluna antecipadamente ou considere usar subconsultas ou colunas geradas.

Q5. A conversão de tipo é segura para decimais ou números grandes?

Usar DECIMAL ou FLOAT pode preservar a precisão, mas erros de arredondamento, perda de precisão ou truncamento ainda podem ocorrer. Sempre especifique precisão e escala suficientes para seus requisitos.

Q6. Qual é a diferença entre ordenar como string e ordenar como número?

Ao ordenar como strings, valores como '10' podem aparecer antes de '2' devido à ordenação lexicográfica. Se você quiser ordem numérica, sempre realize a conversão de tipo antes de ordenar.