Skip to content
Home » La importancia de utilizar un tipo de datos u otro en los campos de una tabla de la base de datos

La importancia de utilizar un tipo de datos u otro en los campos de una tabla de la base de datos

Pongamos un ejemplo, necesitamos almacenar el año y el mes en un solo campo y se plantea la disyuntiva de utilizar un campo tipo CHAR de 7 caracteres o bien uno de tipo DATE. Vamos a analizarlo y explicar porqué es más eficiente utilizar uno de tipo DATE.

Espacio ocupado por DATE

Un campo de tipo DATE en MySQL ocupa 3 bytes de almacenamiento fijo, independientemente de la cantidad de información contenida en el campo.

Espacio ocupado por CHAR(7)

  • Un campo de tipo CHAR(7) ocupa 7 bytes (1 byte por carácter, ya que en un sistema de codificación como ASCII o latin1, cada carácter usa 1 byte).
  • Si usas una codificación multibyte como UTF-8, cada carácter puede ocupar más de 1 byte (generalmente hasta 3 bytes por carácter).

En el caso más común (usando una codificación como latin1), CHAR(7) ocupa más espacio que DATE, porque 7 bytes > 3 bytes.

¿Cuánto ahorrarías?

En lugar de ahorrar espacio, usar CHAR(7) aumentará el uso de almacenamiento en aproximadamente 4 bytes por fila.

Ejemplo de cálculo:

Si tienes 1,000,000 filas:

  • Espacio con DATE: 3 bytes×1,000,000=3,000,000 bytes.
  • Espacio con CHAR(7): 7 bytes×1,000,000=7,000,000.

La diferencia es:7,000,000−3,000,000=4,000,000 bytes (4 MB adicionales).7,000,000 – 3,000,000 = 4,000,000 (4 MB adicionales).

Esto en lo relativo al espacio que se utiliza. Ahora vamos a analizar la sencillez y rapidez a la hora de realizar una consulta SQL:

Ventajas del campo DATE

  1. Operaciones y filtros más eficientes:
    • MySQL almacena internamente los campos de tipo DATE como números binarios (3 bytes), lo que permite realizar operaciones matemáticas, comparaciones y filtros de manera mucho más rápida y eficiente.
    • Ejemplo: SELECT * FROM tabla WHERE fecha BETWEEN '2024-01-01' AND '2024-12-31'; En este caso, MySQL usa índices y optimizaciones específicas para fechas.
  2. Facilidad para manejar intervalos:
    • Puedes utilizar funciones nativas de MySQL, como DATE_ADD, DATE_SUB o YEAR y MONTH, para realizar cálculos directamente sobre la fecha.
    • Ejemplo: Extraer el año y el mes:sqlCopiar códigoSELECT YEAR(fecha) AS año, MONTH(fecha) AS mes FROM tabla;
  3. Compatibilidad con rangos:
    • Los rangos se procesan con operadores como BETWEEN, y no tienes que preocuparte por formatear cadenas para filtrar resultados.
  4. Validación automática:
    • MySQL valida automáticamente los valores de tipo DATE. No permite valores inválidos (por ejemplo, 2024-13 o 2024-02-30), evitando errores de datos.

Desventajas del campo CHAR(7)

  1. Operaciones y filtros menos eficientes:
    • Los valores de tipo CHAR(7) se comparan como cadenas de texto, lo cual es más lento que la comparación de fechas almacenadas en formato binario.
    • Para realizar operaciones como comparar rangos, tienes que convertir manualmente los valores o diseñar las consultas cuidadosamente.
    • Ejemplo: Para filtrar por rango: SELECT * FROM tabla WHERE fecha_formateada BETWEEN '2024-01' AND '2024-12';
  2. Mayor complejidad al trabajar con la información:
    • Si necesitas calcular el rango de meses o extraer el año, debes usar operaciones adicionales como SUBSTRING o convertir la cadena de texto, lo cual es más complicado y menos eficiente.
    • Ejemplo: SELECT SUBSTRING(fecha_formateada, 1, 4) AS año, SUBSTRING(fecha_formateada, 6, 2) AS mes FROM tabla;
  3. Mayor riesgo de datos inconsistentes:
    • MySQL no valida automáticamente los datos en un campo de tipo CHAR(7). Esto significa que podrías almacenar valores inválidos (por ejemplo, 2024-13 o abcd-ef), lo cual complica las consultas y los resultados.

La conclusión es clara, debe utilizarse el campo de tipo DATE.