En SQL existen varios tipos de datos principales: cadenas (por ejemplo, VARCHAR, CHAR, TEXT), numéricos (INT, DECIMAL, FLOAT), fechas y horas (DATE, TIMESTAMP). Es muy importante elegir el tipo más pequeño adecuado para los datos específicos, para ahorrar espacio y optimizar la indexación. Un error común es elegir un tipo con una longitud excesiva (por ejemplo, VARCHAR(255) en lugar de VARCHAR(50)), lo que puede llevar a un gasto innecesario de recursos.
Otra diferencia importante son los tipos numéricos: FLOAT almacena valores aproximados, mientras que DECIMAL almacena valores exactos, lo que es útil para operaciones financieras. Comparar cadenas de diferentes codificaciones, por ejemplo, puede dar resultados inesperados si no se tiene en cuenta COLLATE.
Ejemplo:
-- Ejemplo de trabajo con incompatibilidad de tipos declare @price varchar(10) = '100.99'; select @price + 1; -- Error: no se puede sumar una cadena y un número -- Sin conversión explícita de tipos no funcionará
Pregunta: ¿Qué sucede si se compara un campo de tipo VARCHAR con un número? Por ejemplo: WHERE code = 123? ¿Funciona el índice rápidamente?
Respuesta: SQL intentará convertir el número a una cadena y comparar como cadenas. Sin embargo, si se ha construido un índice numérico sobre este campo, no se utilizará en la comparación de cadenas, y la consulta se ralentizará. Se recomienda siempre utilizar un tipo de datos estricto y conversiones explícitas si es necesario.
Ejemplo:
SELECT * FROM products WHERE code = '123'; -- El índice puede ser utilizado SELECT * FROM products WHERE code = 123; -- El índice NO se utiliza, puede haber un full scan
Historia
VARCHAR para admitir diferentes formatos de moneda. Después de un par de años, fue necesario ordenar los productos por precio: las ordenaciones no funcionaban correctamente y la indexación era imposible. Se requirió una complicada migración y conversión de tipos, lo que tomó semanas.Historia
FLOAT para almacenar sumas. En los informes surgieron discrepancias debido a redondeos, y después de un año esto llevó a errores significativos en la distribución de bonificaciones.Historia
En los registros de una startup, la fecha y la hora se registraron como texto (VARCHAR). Cuando fue necesario calcular intervalos, se descubrió que las horas estaban en diferentes formatos, y los cálculos requerían un costoso parsing normalizador, lo que afectó negativamente al rendimiento.