MySQL: Convertir cadenas a números con CAST y CONVERT

1. Introducción

Al administrar una base de datos en MySQL, con frecuencia encontrarás situaciones como “los datos que deseas tratar como números se almacenan como tipo cadena” o “no puedes realizar cálculos o agregaciones porque sigue siendo una cadena”. Por ejemplo, los datos importados desde Excel o CSV suelen almacenarse como tipos VARCHAR o CHAR aunque sean numéricos. Tal cual, no puedes realizar operaciones numéricas como sumas, promedios o comparaciones sin problemas, y eso detiene la escritura de tu SQL.

Por otro lado, también existen casos en los que deseas tratar datos numéricos como cadenas. Por ejemplo, rellenar identificadores o códigos con ceros a la izquierda, o concatenarlos con otras columnas como texto para mostrarlos. En tales situaciones, necesitas convertir tipos numéricos a tipos de cadena.

De esta manera, “Conversión de Tipos de Cadena y Numérico” es una de las habilidades fundamentales para manipular datos libremente en MySQL. Al dominar las conversiones de tipos de manera adecuada, puedes mantener la integridad de los datos y permitir una agregación y procesamiento flexibles.

En este artículo explicaremos con claridad, incorporando el conocimiento práctico, los métodos para convertir entre cadenas y números en MySQL, cómo usarlos, así como los errores comunes y las mejores prácticas. Este contenido es útil tanto para principiantes como para profesionales que escriben SQL a diario, así que siéntete libre de consultarlo.

2. Tipos de Conversión de Tipos en MySQL

MySQL ofrece varias funciones convenientes para convertir tipos de datos. Aquí explicaremos los dos patrones: “conversión de tipo explícita” y “conversión de tipo implícita”, junto con sus métodos representativos.

2.1 Conversión de Tipo Explícita

La conversión de tipo explícita es un método en el que se especifica claramente en SQL convertir un valor a un tipo determinado. Las siguientes dos funciones se utilizan con frecuencia.

Función CAST CAST() es una función estándar de SQL que convierte un valor especificado a un tipo especificado. También se utiliza ampliamente en MySQL.

SELECT CAST('123' AS SIGNED);

En este ejemplo, la cadena '123' se convierte en un tipo entero con signo (SIGNED). También puede convertirse en varios tipos, como UNSIGNED (entero sin signo), DECIMAL (decimal), CHAR (cadena), DATE (fecha), y así sucesivamente.

Función CONVERT CONVERT() también es una función para convertir valores a otros tipos de datos. El formato es el siguiente.

SELECT CONVERT('456' , UNSIGNED);

En este ejemplo, la cadena '456' se convierte en un tipo entero sin signo (UNSIGNED). La principal diferencia con respecto a CAST() es que CONVERT() también se puede usar para la conversión de juego de caracteres.

2.2 Conversión de Tipo Implícita

La conversión de tipo implícita es un mecanismo por el cual MySQL convierte automáticamente los tipos cuando se realizan operaciones o comparaciones en SQL. Por ejemplo, al sumar un número y una cadena, MySQL convierte automáticamente la cadena a un número y realiza el cálculo.

SELECT 1 + '2';
-- The result is 3

De manera similar, cuando deseas concatenar un número como cadena.

SELECT CONCAT(10, ' apples');
-- The result is '10 apples'

La conversión de tipo implícita es conveniente, pero puede llevar a resultados inesperados; por lo tanto, se recomienda usar la conversión de tipo explícita en procesos complejos o escenarios importantes.

3. Ejemplos Prácticos de Conversión de Cadena a Número

En MySQL, si los valores numéricos se almacenan como cadenas (tipo CHAR o tipo VARCHAR), no se pueden realizar cálculos ni comparaciones numéricas directamente. Para agregar y analizar correctamente dichos datos, es necesario convertir las cadenas a tipos numéricos. Aquí presentamos los métodos de conversión más usados y las precauciones.

3.1 Conversión Usando la Función CAST

El método más básico es usar la función CAST(). Por ejemplo, para convertir la cadena '100' en un entero, escríbelo así.

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

`SIGNED` convierte en entero con signo, y `UNSIGNED` convierte en entero sin signo. Para datos con punto decimal, también se pueden usar `DECIMAL` o `FLOAT`.

SELECT CAST(‘123.45’ AS DECIMAL(10,2)) AS decimal_result; — Result: 123.45

### 3.2 Conversión usando la función CONVERT

La función `CONVERT()` también se puede usar de manera casi idéntica.

SELECT CONVERT(‘200’, SIGNED) AS conversion_result; — Result: 200

Ambas producen el mismo resultado, pero `CAST()` tiene mayor portabilidad como SQL estándar, por lo que se recomienda elegir `CAST()` cuando haya dudas.

### 3.3 Conversión implícita por operaciones

Al calcular tipos numéricos y tipos de cadena dentro de expresiones aritméticas SQL, la cadena se convierte automáticamente en un valor numérico. Por ejemplo, se puede usar así.

SELECT ’50’ + 25 AS total; — Result: 75

Este mecanismo también se puede aplicar a funciones de agregación. Por ejemplo, si pasas una columna de tipo cadena directamente a `SUM()`, MySQL la convierte automáticamente a numérico y la suma.

SELECT SUM(amount) FROM sales_data; — Even if the amount column is VARCHAR, it automatically sums numerically

### 3.4 Ten cuidado con las cadenas con relleno cero y valores no numéricos

Las cadenas con relleno cero (por ejemplo, '000100') también pueden convertirse a numérico.

SELECT CAST(‘000100’ AS SIGNED) AS conversion_result; — Result: 100

Sin embargo, ten cuidado si se mezclan caracteres que no son números. Si conviertes como `CAST('abc123' AS SIGNED)`, y no hay parte numérica desde el principio, se convierte en `0`. Dependiendo de la calidad de los datos, es importante realizar **validación de valor de entrada** antes de la conversión.

### 3.5 Ejemplos de uso práctico

* Agrupar datos de ventas o montos que han sido convertidos a cadena durante la importación desde Excel o CSV
* Al ordenar identificadores almacenados como tipos de cadena a pesar de ser numéricos, como códigos de clientes, en orden numérico
* Cuando deseas ordenar cadenas de fecha guardadas en formato `YYYYMMDD` en orden cronológico (descrito más adelante)

## 4. Ejemplos prácticos de conversión de numérico a cadena

En MySQL, hay muchas situaciones en las que necesitas manejar datos numéricos como cadenas. Por ejemplo, cuando deseas mostrar identificadores o códigos con relleno cero, o combinar datos numéricos con otro texto para crear mensajes. Esta sección presenta métodos representativos para convertir números a cadenas y ejemplos de aplicación práctica.

### 4.1 Conversión usando la función CAST

Para convertir explícitamente tipos numéricos (como INT o DECIMAL) a tipos de cadena, utiliza la función `CAST()`.

SELECT CAST(123 AS CHAR) AS string_result; — Result: ‘123’

Con este método, puedes concatenar fácilmente columnas numéricas como cadenas con otras cadenas.

### 4.2 Conversión usando la función CONVERT

`CONVERT()` puede lograr el mismo resultado.

SELECT CONVERT(456, CHAR) AS conversion_result; — Result: ‘456’

No hay prácticamente diferencia con `CAST()`, pero desde la perspectiva del SQL estándar, `CAST()` es algo recomendado.

### 4.3 Conversión implícita mediante operaciones

En MySQL, al concatenar números y cadenas usando la función `CONCAT()` o similar, el número se convierte automáticamente en cadena.

SELECT CONCAT(2024, ‘ year’) AS year_display; — Result: ‘2024 year’

Este tipo de conversiones implícitas se usan comúnmente en la generación de informes cotidianos y en la transformación de datos.

### 4.4 Casos de uso práctico comunes

* **Generación de identificadores con relleno cero**: Cuando deseas mostrar un identificador numérico con 5 dígitos, úsalo en combinación con `LPAD()`.

SELECT LPAD(CAST(id AS CHAR), 5, ‘0’) AS padded_id FROM users; — For id=7, it becomes ‘00007’

* **Concatenación de cadenas para fechas o montos**

SELECT CONCAT(‘The total amount is ‘, CAST(total AS CHAR), ‘ yen.’) AS message FROM orders; — For total=1500, ‘The total amount is 1500 yen.’

### 4.5 Notas

Converting a number to a string may look the same, but it changes the behavior of sorting (sort order) and comparison operations.  
For example, when sorting as strings, '20' comes before '100' (lexicographical order), so it is important to choose the method based on the use case.

## 5. Casos de uso avanzados con conversión de tipos

La conversión de tipos va más allá de la simple conversión de números o cadenas y ofrece varias aplicaciones prácticas. Aquí presentamos ejemplos de uso común y sus puntos clave.

### 5.1 Comparación y conversión de cadenas de fechas

Si las fechas se almacenan en la base de datos como tipos numéricos o de cadena como `YYYYMMDD`, la comparación simple de cadenas no las ordenará como se espera.  
En este caso, al convertir a un número usando `CAST()`, puedes ordenar o comparar en el orden de fecha correcto.

SELECT * FROM events ORDER BY CAST(event_date AS UNSIGNED); — Data like ‘20240501’, ‘20240502’, … will be sorted in date order

Además, al combinar con la función `REPLACE()`, puedes convertir fechas separadas por guiones como `'2024-05-01'` en enteros.

SELECT CAST(REPLACE(‘2024-05-01’, ‘-‘, ») AS UNSIGNED); — Result: 20240501

### 5.2 Ordenación de tipos ENUM o valores de código

Por ejemplo, si deseas ordenar tipos ENUM o valores de código que tienen un significado numérico en orden numérico en lugar de orden diccionario, ordenar después de convertir al tipo numérico con `CAST()` dará un orden intuitivo.

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

### 5.3 Uso en agregación y formato de datos

Por ejemplo, al agregar datos de ventas donde los montos se almacenan como tipo `VARCHAR`, usar `SUM(CAST(amount AS SIGNED))` permite un cálculo total preciso.

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



### 5.4 Prevención de problemas mediante precisión y selección de tipo

Especialmente para decimales o números grandes, convertir al tipo `DECIMAL` preserva la precisión.  
Además, la distinción entre `SIGNED` y `UNSIGNED` es importante, y debes elegir según si los datos incluyen valores negativos.

SELECT CAST(‘1234.567’ AS DECIMAL(10, 3)); — Result: 1234.567

### 5.5 Detección de errores y datos inválidos

Si ocurre un NULL no intencional o 0 durante la conversión de tipo, puede ser una señal de datos inválidos.  
Por ejemplo, si se incluye una cadena que no se puede convertir a número, `CAST()` puede resultar en 0 o NULL.  
En tales casos, es importante verificar los resultados de la conversión y vincularlos al manejo de errores o a la limpieza de datos.

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 converted to numbers

## 6. Diferencias entre CAST y CONVERT

Al realizar la conversión de tipos en MySQL, usarás principalmente la función `CAST` o la función `CONVERT`. Ambas pueden parecer similares, pero hay diferencias en su uso detallado y características. En este capítulo, explicaremos las diferencias entre ellas y los puntos clave para elegir cuál usar.

### 6.1 Diferencias básicas

* **Función CAST** `CAST(value AS type)` la sintaxis convierte explícitamente un valor al tipo especificado. Se define en SQL estándar y se puede usar con la misma sintaxis en muchas bases de datos.

SELECT CAST(‘123’ AS SIGNED);

* **Función CONVERT** `CONVERT(value, type)` la sintaxis, que también convierte un valor al tipo especificado. En MySQL, se puede usar tanto para conversión de tipo de dato como para conversión de juego de caracteres.

SELECT CONVERT(‘123’, SIGNED); — Type conversion SELECT CONVERT(‘hello’ USING utf8mb4); — Character set conversion

### 6.2 Compatibilidad con SQL estándar

`CAST` es un estándar internacional de SQL, por lo que tiene la ventaja de ser fácil de portar a otras bases de datos (PostgreSQL, SQL Server, Oracle, etc.). Por otro lado, `CONVERT` tiene extensiones y comportamientos específicos de MySQL, y especialmente para la **conversión de conjunto de caracteres**, existe una sintaxis dedicada como `CONVERT(expr USING charset_name)`.

### 6.3 Puntos clave para elegir cuál usar

* **Para la conversión de tipo (números, cadenas, fechas, etc.)** es generalmente más seguro usar `CAST`. Al ser SQL estándar, tiene alta portabilidad y puedes estar seguro al migrar a otra base de datos en el futuro.
* **Para la conversión de conjunto de caracteres (por ejemplo, sjis a utf8mb4)** debes usar `CONVERT` en la forma `CONVERT(expr USING charset_name)`.
* **Para características específicas de MySQL o casos especiales** `CONVERT` puede ser más flexible en algunas situaciones, pero considerando la generalidad, es mejor comenzar con `CAST` y considerar `CONVERT` solo cuando sea necesario.

### 6.4 Comparación de ejemplos

— Type conversion using CAST (converting 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

* Si la conversión falla con cualquiera de los dos, puede devolver `NULL` o `0`.
* La conversión de conjunto de caracteres no puede realizarse con `CAST`.
* El comportamiento puede diferir según el modo SQL o la versión, así que no olvides verificar la operación tanto en el entorno de desarrollo como en producción.

## 7. Notas y mejores prácticas

Al utilizar conversiones de tipos de cadena y numéricos en MySQL, existen varios tropiezos inesperados y puntos a tener en cuenta. Aquí presentamos mejores prácticas para prevenir problemas y usar conversiones de tipos de forma segura y precisa.

### 7.1 Errores o aparición de NULL/0 por conversiones inválidas

Cuando se realiza una conversión de tipo, si el valor de origen no está en el formato correcto, pueden devolverse `NULL` o `0` inesperados.

SELECT CAST(‘abc’ AS SIGNED) AS result; — Result: 0 (MySQL’s default behavior)

Por tanto, intentar convertir una cadena que no es un número a un valor numérico produce 0; por eso, revisa de antemano si existen valores inválidos mezclados en los datos originales.  
Además, dependiendo del modo SQL, puede generar un error o `NULL`; por eso es importante confirmar la configuración en el entorno de producción.

### 7.2 Selección de precisión y signo (SIGNED/UNSIGNED)

* Convierte los datos que contienen decimales a tipo `DECIMAL` o `FLOAT`.  
* Si hay posibilidad de valores negativos, especifica `SIGNED`; si son únicamente enteros positivos, especifica `UNSIGNED`.

Selecciona el tipo adecuado según el caso de uso.

### 7.3 Impacto en índices

La cláusula `WHERE` o la cláusula `ORDER BY` que use conversión de tipo (especialmente `CAST` o `CONVERT`) puede hacer que los índices sean ineficaces y degrade el rendimiento.

SELECT * FROM users WHERE CAST(user_id AS SIGNED) = 1000; — Even if there is an index on user_id, it often won’t be used

En casos con grandes volúmenes de datos o donde la velocidad sea importante para condiciones de búsqueda, es ideal diseñar con tipos de datos originales unificados, evitando conversiones en la medida de lo posible.

### 7.4 No confiar demasiado en la conversión de tipo implícita

La conversión de tipo implícita de MySQL es conveniente, pero suele provocar comportamientos inesperados, por lo que **para procesos críticos, usar `CAST` o `CONVERT` explícitos** es más seguro.

SELECT ‘100a’ + 20; — Result: 100 (Only the leading numeric part of ‘100a’ is used)

Para evitar errores inesperados o inconsistencias en los datos, haz de usar conversiones explícitas una práctica habitual.

### 7.5 Verificación de tipos en la etapa de entrada de datos

En la fase de diseño de la base de datos, guarda “números como tipos numéricos” y “cadenas como tipos string”, y buscar un diseño que requiera la menor cantidad posible de conversiones de tipo es también la base para evitar problemas.

## 8. Resumen

La conversión de tipos entre cadenas y números en MySQL es un tema inevitable en el procesamiento diario de datos, agregación y operaciones del sistema.  
Este artículo cubre un amplio rango, desde los conceptos básicos hasta aplicaciones avanzadas y precauciones importantes.

La conversión de cadena a número utiliza métodos explícitos como `CAST` y `CONVERT`, y en la práctica, también se usan comúnmente conversiones de tipo implícitas. Sin embargo, considerando la calidad y seguridad de los datos, es importante aspirar a conversiones explícitas. Por el contrario, la conversión de número a cadena también es útil en muchos escenarios, como el formato de identificadores, la generación de códigos y la salida de mensajes.

Además, las técnicas de conversión de tipos, como las aplicaciones a tipos de fecha, agregación, ordenamiento y detección de errores, contribuyen directamente a resolver diversos desafíos prácticos. Sin embargo, las conversiones de tipo pueden presentar problemas inesperados e impactos en el rendimiento, por lo que asegúrese de seguir los puntos listados en *Precauciones y Mejores Prácticas* para las operaciones.

Al dominar las conversiones de tipo correctamente, el alcance de las operaciones de datos con MySQL se amplía enormemente. Espero que este artículo sirva como un recurso útil para su trabajo y aprendizaje diarios.

## 9. Preguntas Frecuentes (FAQ)

### Q1. "¿Qué sucede cuando se CAST una cadena como 'abc' a un valor numérico?"

En MySQL, al intentar convertir una cadena a un tipo numérico (como SIGNED o UNSIGNED), devuelve la parte numérica si está al principio; de lo contrario, devuelve 0.

SELECT CAST(‘abc’ AS SIGNED); — Result is 0 SELECT CAST(‘123abc’ AS SIGNED); — Result is 123 «`

Sin embargo, dependiendo del modo SQL (por ejemplo, STRICT_TRANS_TABLES), puede resultar en un error o NULL.

Q2. ¿Cuál deberías usar, CAST o CONVERT?

Para conversiones de tipo básicas (números a/desde cadena o tipos de fecha, etc.), se recomienda usar CAST, que cumple con el estándar SQL. Por otro lado, para conversiones de conjunto de caracteres, necesitas usar la función CONVERT con la cláusula USING. Elige según el propósito.

Q3. ¿Es suficiente la conversión de tipo implícita?

La conversión de tipo implícita funciona para consultas o pruebas de pequeña escala, pero para agregaciones importantes o desarrollo de sistemas, se recomienda la conversión de tipo explícita (CAST o CONVERT). Para evitar comportamientos inesperados o errores, haz un hábito describir las conversiones explícitamente tanto como sea posible.

Q4. ¿Al usar la conversión de tipo en cláusulas WHERE o ORDER BY se vuelven ineficaces los índices?

Sí. Aplicar CAST o CONVERT a una columna puede impedir que se use el índice establecido en esa columna.

Para búsquedas rápidas en grandes volúmenes de datos, unifica los tipos de columna con anticipación, o usa subconsultas o columnas generadas para optimizar.

Q5. ¿Es segura la conversión de tipo para decimales o números grandes?

Es posible mantener la precisión usando conversiones a tipos DECIMAL o FLOAT. Sin embargo, pueden ocurrir errores de redondeo, pérdida de precisión o truncamiento durante la conversión, por lo que es importante tomar medidas como especificar el número necesario de dígitos.

Q6. ¿Cuál es la diferencia entre ordenar como cadenas y ordenar como números?

Al ordenar como cadenas, «2» aparece antes que «10» (en orden diccionario o alfabético), así que si desea el orden numérico, siempre realice la conversión de tipo antes de ordenar.