Tipos de datos SQL: numéricos, de caracteres, de fecha y hora, y binarios. Domine la optimización del almacenamiento, el rendimiento de las consultas, las mejores prácticas de integridad de los datos y las diferencias entre proveedores.
Un tipo de datos SQL es una especificación fundamental que define qué valores puede contener una columna y cuánto espacio de almacenamiento requieren esos valores en una tabla de base de datos. Comprender los tipos de datos SQL es esencial para cualquiera que cree pipelines de datos, escriba consultas o diseñe esquemas de bases de datos, ya que estos tipos controlan directamente la integridad de los datos, la eficiencia del almacenamiento y el rendimiento de las consultas. Cuando define una columna en una tabla de base de datos, no solo está especificando un nombre: está estableciendo un contrato sobre qué tipo de información residirá en esa columna y cómo debe tratarla la base de datos.
No se puede subestimar la importancia de elegir el tipo de datos correcto. Los tipos de datos SQL imponen reglas lógicas sobre qué valores se pueden almacenar, lo que evita que se introduzcan datos no válidos en primer lugar. También afectan drásticamente la rapidez con la que se ejecutan sus consultas y la cantidad de espacio en disco que consumen sus tablas. Un tipo de datos mal elegido puede ralentizar las consultas, desperdiciar almacenamiento y crear errores sutiles en sus pipelines de datos. Por el contrario, seleccionar los tipos adecuados puede mejorar la escalabilidad a largo plazo y aumentar drásticamente el rendimiento de la base de datos en cargas de trabajo analíticas, aplicaciones en tiempo real y pipelines de características de machine learning.
Los tipos de datos SQL se categorizan a grandes rasgos en cuatro grupos principales: tipos de datos numéricos para cálculos matemáticos, tipos de datos de caracteres y cadenas para texto, tipos de datos de fecha y hora para registrar cuándo ocurren los eventos, y tipos de datos especializados para datos binarios y otros formatos. Los diferentes sistemas de bases de datos (MySQL, PostgreSQL, SQL Server y Oracle) implementan cada uno de estos grupos con ligeras variaciones en la nomenclatura, la precisión y los requisitos de almacenamiento. Esta guía proporciona una referencia práctica para comprender los tipos de datos SQL en los sistemas de bases de datos más comunes, junto con las mejores prácticas para elegir el tipo adecuado para su caso de uso.
Un tipo de datos es más que una simple etiqueta. Cuando declara que una columna es de tipo INTEGER o VARCHAR, le está diciendo exactamente a su sistema de gestión de bases de datos qué tipo de valores pertenecen a esa columna y cómo tratarlos durante las consultas y el almacenamiento. La base de datos utiliza esta información para validar los datos en el momento de la inserción, evitando entradas que violen las restricciones del tipo. Los sistemas de bases de datos modernos, como los basados en transacciones ACID, garantizan que esta validación ocurra de manera confiable, incluso durante patrones de acceso concurrente.
Considere un ejemplo sencillo: si define una columna como INTEGER, la base de datos rechazará cualquier intento de insertar texto como "hello" o valores no enteros como 3.14. Esta validación ocurre automáticamente, imponiendo la integridad de los datos al negarse a almacenar formatos de datos incorrectos. Sin esta imposición, las consultas y los análisis posteriores encontrarían datos corruptos o inconsistentes, lo que provocaría resultados incorrectos y pérdida de tiempo en la depuración.
Los tipos de datos también comunican la intención a otros desarrolladores e ingenieros de datos que trabajan con su esquema. Cuando alguien ve que una columna está definida como DECIMAL en lugar de FLOAT, comprende de inmediato que esta columna almacena valores monetarios precisos que no pueden tolerar errores de redondeo. Esta documentación implícita reduce los malentendidos y hace que los esquemas sean más fáciles de mantener a lo largo del tiempo.
La elección del tipo de datos tiene consecuencias directas en la cantidad de espacio en disco que consumen sus tablas y en la rapidez con la que se pueden ejecutar las consultas. La eficiencia del almacenamiento afecta a sus facturas de la nube, los tiempos de copia de seguridad y la cantidad de filas que puede almacenar en memoria para su procesamiento. El rendimiento de las consultas depende en parte del tamaño del tipo de datos: los tipos más pequeños se pueden procesar más rápido porque caben más filas en la caché de la CPU y se deben transferir menos datos entre el almacenamiento y el procesamiento. Para los equipos que crean pipelines ETL que procesan millones de filas diariamente, estas optimizaciones se traducen en mejoras medibles de costos y latencia.
Los tipos de datos de cadena varían significativamente en su huella de almacenamiento. Una columna CHAR siempre reserva toda su longitud declarada, rellenando con espacios incluso si almacena un valor corto. Por el contrario, una columna VARCHAR solo utiliza el espacio necesario para el valor real almacenado. Si la mayoría de los nombres de sus clientes tienen menos de 30 caracteres, almacenarlos como VARCHAR(50) ahorra un espacio sustancial en comparación con CHAR(50). Este ahorro de espacio se acumula en millones de filas y puede reducir la latencia de las consultas porque caben más datos en la memoria disponible.
Los tipos numéricos también influyen en el rendimiento. Usar BIGINT cuando INT sería suficiente desperdicia almacenamiento y procesamiento. Por el contrario, usar SMALLINT para una columna que necesita almacenar valores superiores a 32,000 provoca errores de desbordamiento. Comprender los requisitos de rango y precisión de sus datos le permite elegir el tipo de datos más pequeño que contenga sus valores de manera segura, manteniendo su base de datos rápida y eficiente.
Los índices, que aceleran drásticamente el rendimiento de las consultas, son más rápidos cuando se definen en los tipos de datos adecuados. Un índice en una columna TINYINT es más eficiente que un índice en una columna TEXT. Al elegir tipos numéricos de tamaño adecuado y evitar índices en columnas de texto muy grandes, multiplica los beneficios de rendimiento de la indexación en toda su carga de trabajo. Los motores de consulta distribuidos como Apache Spark se benefician especialmente de los tipos de datos del tamaño adecuado, ya que los tipos más pequeños reducen la transferencia de red durante las operaciones de shuffle.
La regla de oro para la selección del tipo de datos es utilizar el tipo más pequeño que contenga sus datos de forma segura. Este principio, aplicado de manera constante durante el diseño del esquema, genera beneficios en la eficiencia del almacenamiento, la velocidad de las consultas y la escalabilidad del sistema. Antes de seleccionar un tipo, pregúntese: ¿Cuál es el valor máximo que podría contener esta columna? ¿Cuánta precisión necesito? ¿Será este valor alguna vez NULL?
Para los datos numéricos, examine la distribución real de sus datos. Si una columna contiene valores entre 0 and 100, TINYINT es perfecto. Si almacena ID de clientes que podrían superar los 2,000 millones, INT es suficiente; solo use BIGINT si realmente necesita almacenamiento para valores superiores a 2,000 millones. Hacer esta distinción en docenas de columnas de su esquema puede reducir el tamaño total de la tabla entre un 20% y un 30%, lo que mejora directamente el rendimiento de las consultas.
Al trabajar con cadenas, considere el equilibrio entre almacenamiento y flexibilidad. CHAR le obliga a elegir una longitud máxima y siempre utiliza ese espacio. VARCHAR le permite almacenar datos de longitud variable de manera eficiente, pero requiere que elija un máximo que no cause truncamiento. VARCHAR(50) para nombres logra un equilibrio: es lo suficientemente grande para prácticamente todos los nombres, pero evita el almacenamiento accidental de valores extremadamente largos que podrían representar problemas de calidad de datos. Para bloques de texto muy grandes, como el cuerpo de artículos o mensajes de registro, use tipos TEXT o CLOB que no requieran una especificación de longitud previa.
Valide sus elecciones con datos de muestra antes de implementarlas en producción. Inserte datos reales en una tabla de prueba con el esquema propuesto y observe el uso real del almacenamiento. Ejecute las consultas previstas y mida el rendimiento. Este enfoque empírico revela si sus elecciones respaldan la carga de trabajo que realmente está ejecutando. Las plataformas de bases de datos suelen ofrecer herramientas para analizar los planes de ejecución de consultas e identificar operaciones lentas causadas por tipos de datos subóptimos.
Los tipos de datos numéricos almacenan números y se dividen en dos familias principales: tipos enteros para números enteros y tipos decimales o de punto flotante para números con componentes fraccionarios.
Los tipos enteros representan números enteros sin decimales. El tipo de datos INTEGER, también llamado INT, es la opción más común para valores enteros y almacena un número de 4 bytes que puede representar valores desde aproximadamente -2,000 millones hasta +2,000 millones. Cuando necesita un rango menor (por ejemplo, almacenar valores de edad que no superen los 127), TINYINT utiliza solo un byte y es perfecto. SMALLINT ocupa dos bytes y maneja valores de hasta aproximadamente 32,000, lo que resulta útil para columnas como cantidades o recuentos que se mantienen relativamente pequeños. BIGINT, un entero de 8 bytes, admite números astronómicos y es necesario cuando se almacenan ID generados a partir de sistemas distribuidos o marcas de tiempo medidas en milisegundos.
El tipo de datos DECIMAL, a veces llamado NUMERIC en la documentación del estándar SQL, almacena números de precisión fija adecuados para cálculos financieros y otros contextos donde los errores de redondeo son inaceptables. DECIMAL almacena valores exactos sin la aproximación inherente a la aritmética de punto flotante. Cuando define DECIMAL(10,2), está diciendo: "Quiero almacenar números con hasta 10 dígitos en total, donde exactamente 2 de esos dígitos estén a la derecha del punto decimal". Esta precisión significa que DECIMAL(10,2) almacena de forma segura valores como 99999999.99, pero rechazará cualquier valor con más de dos decimales. Los bancos y los sistemas de contabilidad confían en DECIMAL porque las regulaciones financieras exigen cálculos exactos y auditables sin errores de redondeo.
NUMERIC sirve como el nombre estándar de SQL para datos decimales de precisión fija y se comporta de manera idéntica a DECIMAL en la mayoría de los sistemas de bases de datos. Algunas bases de datos utilizan NUMERIC y DECIMAL de forma intercambiable, mientras que otras los documentan por separado por razones históricas. Consulte la documentación de su base de datos para confirmar el comportamiento exacto, pero trátelos como funcionalmente equivalentes en la práctica.
La creación de una tabla con columnas numéricas ilustra estos tipos en contexto. Una tabla de ventas típica podría verse así:
Aquí, employee_id utiliza INT porque los ID de los empleados suelen estar en el rango de los millones. Age utiliza TINYINT porque la edad humana nunca supera los 127 años. Salary y bonus_percentage utilizan DECIMAL para garantizar cálculos precisos durante el procesamiento de la nómina, donde incluso los errores de redondeo más pequeños se acumulan en toda la organización. Las plataformas de datos modernas como Delta Lake aplican estos tipos de forma estricta, lo que garantiza que no se puedan insertar datos con tipos incorrectos en las tablas de producción.
Los tipos de punto flotante almacenan valores numéricos aproximados con una precisión específica. FLOAT y DOUBLE utilizan la representación binaria IEEE 754, que sacrifica la exactitud a cambio de velocidad y rango. Un FLOAT suele ocupar 4 bytes y almacena valores aproximados, mientras que DOUBLE ocupa 8 bytes y ofrece una mayor precisión.
La representación de punto flotante introduce anomalías de redondeo porque muchos valores decimales no se pueden representar exactamente en binario. Por ejemplo, el 0.1 no se puede representar exactamente en punto flotante binario, por lo que cualquier cálculo que implique 0.1 podría tener un ligero desfase. Estos pequeños errores se acumulan en largas cadenas de cálculos y, con el tiempo, producen resultados visiblemente incorrectos. Por este motivo, nunca debe utilizar FLOAT o DOUBLE para datos monetarios u otros valores donde la exactitud sea fundamental.
La elección adecuada entre DECIMAL y FLOAT depende de su caso de uso. Utilice DECIMAL para cualquier dato financiero, mediciones científicas precisas o cálculos donde la corrección sea auditable. Utilice FLOAT para aproximaciones, computación científica donde se acepten pequeños errores o características de machine learning donde la ligera imprecisión no afecte a la calidad del modelo. El rendimiento de las consultas mejora con el uso de tipos de datos del tamaño adecuado, y las operaciones FLOAT son más rápidas que las operaciones DECIMAL porque las matemáticas de punto flotante están aceleradas por hardware en todos los procesadores modernos.
Compare estos dos enfoques para almacenar precios de productos:
La segunda versión garantiza que los precios como 19.99 se almacenen exactamente, sin sufrir nunca errores de redondeo durante los cálculos o la visualización. La primera versión podría representar 19.99 como 19.989999... internamente, lo que provocaría discrepancias sutiles en los cálculos totales y en los precios mostrados al cliente.
Los tipos de fecha y hora almacenan información temporal: el momento en que ocurrieron los eventos o cuándo los datos deben considerarse relevantes. Estos tipos son esenciales para el análisis de series temporales, el registro de eventos y los procesos de negocio que realizan un seguimiento de cuándo suceden las cosas.
El tipo DATE almacena solo la parte de la fecha (año, mes y día) en formato YYYY-MM-DD sin ningún componente de hora. Utilice DATE cuando necesite registrar solo el día en que ocurrió algo, como la fecha de nacimiento de un cliente o la fecha de una transacción, sin preocuparse por la hora o el minuto exactos. DATE ocupa un espacio de almacenamiento mínimo (normalmente 3 bytes) y simplifica las consultas que agrupan eventos por día natural.
El tipo TIME almacena solo la parte de la hora (horas, minutos y segundos) sin fecha. TIME es menos común que DATE o TIMESTAMP, pero aparece en esquemas que registran horas recurrentes, como el horario comercial o las horas de citas dentro de un día.
El tipo TIMESTAMP (llamado DATETIME en algunos sistemas como MySQL y SQL Server) almacena información tanto de fecha como de hora en formato YYYY-MM-DD HH:MM:SS. TIMESTAMP captura el momento completo en que ocurrió algo, con precisión de segundos (o más fina, según la base de datos). La mayoría de los sistemas basados en eventos utilizan TIMESTAMP para registrar exactamente cuándo se crearon las entradas de registro, cuándo se realizaron los pedidos o cuándo llegaron las lecturas de los sensores. Muchos sistemas analíticos creados con diseños de esquema en estrella utilizan claves TIMESTAMP para un análisis temporal eficiente y el seguimiento de hechos históricos.
Elija DATE frente a TIMESTAMP en función de sus patrones de consulta. Si su lógica de negocio agrupa eventos por fecha natural y nunca necesita precisión dentro del mismo día, DATE es más limpio y eficiente. Si necesita calcular el tiempo transcurrido entre eventos, detectar tendencias dentro de una misma hora o mantener un orden cronológico preciso, TIMESTAMP es necesario.
Ejemplos de definiciones de columnas de fecha y hora:
Aquí, birthdate utiliza DATE porque solo le interesa la fecha de nacimiento de la persona, no la hora en que nació. account_creation_date utiliza TIMESTAMP porque necesita saber con precisión cuándo se creó la cuenta, potencialmente para detectar patrones de fraude o calcular la antigüedad de la cuenta en días. preferred_contact_time utiliza TIME porque está almacenando una hora recurrente como "llámame a las 2 p. m." sin una fecha específica.
Un problema sutil pero crítico en los datos temporales es el manejo de la zona horaria. Cuando registra que un evento ocurrió a las "2024-03-15 14:30:00", ¿significa eso las 2:30 p. m. en Nueva York, Tokio o UTC? La respuesta importa porque la misma hora de reloj significa cosas diferentes en diferentes zonas horarias.
La mejor práctica es almacenar todas las marcas de tiempo en UTC (Tiempo Universal Coordinado), una referencia horaria independiente de la zona. Cuando su aplicación reciba un evento de un usuario en cualquier zona horaria, conviértalo a UTC antes de almacenarlo en su base de datos. Este enfoque garantiza que todas las marcas de tiempo sean comparables y que pueda responder sin ambigüedades a preguntas como "¿qué eventos ocurrieron primero?" o "¿cuánto tiempo pasó entre estos eventos?".
Algunas bases de datos como PostgreSQL admiten TIMESTAMPTZ (marca de tiempo con zona horaria), que almacena tanto la marca de tiempo como la información de la zona horaria asociada. Al recuperar los datos, la base de datos vuelve a convertir la marca de tiempo UTC a la zona horaria original si es necesario. Este enfoque preserva el contexto de la zona horaria original al tiempo que garantiza la coherencia interna.
DATETIME de SQL Server y DATETIME de MySQL no incluyen información de zona, así que convierta las horas a UTC antes de almacenarlas y vuelva a convertirlas al mostrarlas a los usuarios. La configuración de la sesión afecta a cómo se interpretan las marcas de tiempo en algunas bases de datos, por lo que debe documentar sus suposiciones con claridad.
Los tipos de datos de caracteres almacenan texto y se presentan en variantes de longitud fija y de longitud variable, cada una adecuada para diferentes escenarios.
CHAR almacena cadenas de longitud fija y siempre utiliza la longitud total declarada, rellenando con espacios si el valor real es más corto. CHAR(10) siempre ocupa exactamente 10 bytes por fila, incluso si inserta "hello" (5 caracteres). CHAR destaca cuando casi todos los valores tienen la misma longitud, como los códigos postales de EE. UU. (5 dígitos) o los códigos de país (2 letras). El almacenamiento de longitud fija simplifica la indexación y hace que las exploraciones de tablas tengan un tamaño predecible.
VARCHAR almacena cadenas de longitud variable y utiliza solo el espacio necesario para los datos reales, más una pequeña sobrecarga para registrar la longitud. VARCHAR(100) que almacena "hello" ocupa unos 7 bytes (5 para "hello" más 2 para la codificación de longitud), lo que ahorra 93 bytes en comparación con CHAR(100) para el mismo valor. El tamaño de VARCHAR debe definirse teniendo en cuenta los datos reales: elija VARCHAR(50) para nombres solo si está seguro de que los nombres no superarán los 50 caracteres. Si los nombres suelen tener 30 caracteres pero ocasionalmente pueden llegar a 50, VARCHAR(50) es una opción prudente.
TEXT admite grandes bloques de texto no estructurado sin una longitud máxima declarada. Utilice TEXT para artículos, comentarios o documentos que varíen enormemente en tamaño. Algunas bases de datos distinguen entre TEXT y tipos más especializados como CLOB (Character Large Object), pero la mayoría de los sistemas modernos manejan TEXT de manera eficiente con compresión interna y transmisión.
Para texto internacional que contenga caracteres de varios idiomas, utilice tipos compatibles con Unicode: variantes NVARCHAR o UTF8 según su base de datos. NVARCHAR (VARCHAR nacional) en SQL Server almacena texto codificado en UTF-16 que admite cualquier carácter Unicode. PostgreSQL y MySQL admiten conjuntos de caracteres UTF-8 directamente en VARCHAR con la configuración de colación adecuada. Establezca siempre explícitamente la codificación de caracteres al crear tablas para evitar comportamientos sorprendentes si cambia el valor predeterminado de la base de datos.
Ejemplos de definiciones de columnas de cadena:
Aquí, first_name y last_name utilizan VARCHAR porque los nombres suelen ser cortos pero variables, lo que ahorra espacio en comparación con CHAR. biography utiliza TEXT porque las biografías de los clientes pueden ser desde una sola frase hasta un párrafo completo. country_code utiliza CHAR(2) porque todos los códigos de país tienen exactamente 2 letras, lo que hace que el almacenamiento de longitud fija sea el adecuado.
BLOB (Binary Large Object) almacena datos binarios arbitrarios sin un límite de tamaño máximo. Utilice BLOB para imágenes, documentos PDF, videos o cualquier contenido binario no estructurado que no se ajuste a los tipos estándar. BLOB es adecuado cuando necesita almacenar archivos en su base de datos, aunque muchos sistemas de producción prefieren almacenar archivos grandes en sistemas de almacenamiento de objetos como Amazon S3 y mantener solo las referencias de los archivos en la base de datos.
VARBINARY almacena datos binarios de longitud variable con un tamaño máximo explícito. VARBINARY(256) almacena hasta 256 bytes de datos binarios, ocupando solo el espacio necesario para el contenido real. VARBINARY funciona bien para datos binarios de tamaño fijo como firmas criptográficas, sumas de comprobación o UUIDs.
BINARY almacena datos binarios de longitud fija, rellenando con bytes nulos si es necesario. BINARY(16) siempre ocupa exactamente 16 bytes, lo cual es útil para almacenar identificadores de tamaño fijo como UUID de 128 bits. El tamaño de BINARY debe definirse con cuidado, ya que desperdiciar espacio con declaraciones demasiado grandes afecta al rendimiento.
En la práctica, almacenar archivos grandes en un almacenamiento de objetos en lugar de en bases de datos suele ser mejor. El almacenamiento de objetos es más barato, más rápido para archivos grandes y escala más fácilmente que el almacenamiento de bases de datos. Guarde la referencia del archivo y los metadatos en la base de datos, no el archivo en sí.
Ejemplos de definiciones de columnas binarias:
Aquí, content utiliza BLOB para almacenar los datos reales del documento. checksum utiliza VARBINARY para almacenar un hash SHA-256 (32 bytes) que verifica que el documento no se haya corrompido. uuid utiliza BINARY(16) para almacenar un identificador UUID de tamaño fijo.
Indexar columnas binarias es complicado porque los índices B-tree tradicionales asumen que los valores se pueden ordenar y comparar. Puede indexar columnas BINARY para coincidencias exactas, pero no para consultas de rango. Evite indexar columnas BLOB a menos que su base de datos tenga índices de mapa de bits o hash especializados diseñados para datos binarios.
Para comprobar la integridad de los datos en el contenido binario, mantenga una columna checksum separada que almacene un hash de los datos binarios. Si sospecha que hay corrupción, vuelva a calcular el hash y compárelo con el valor almacenado. Este enfoque es mucho más rápido que volver a examinar todo el contenido binario.
Los tipos de datos booleanos almacenan valores verdadero/falso, esenciales para flags, indicadores de estado y decisiones de sí/no. Los valores verdadero y falso simplifican el modelado de datos y evitan estados no válidos como NULL o cadenas ambiguas como "sí" o "1".
Diferentes bases de datos implementan los booleanos de manera diferente. PostgreSQL tiene un tipo BOOLEAN nativo que acepta true/false, yes/no, on/off, 1/0 en varios formatos. MySQL trata BOOLEAN como un entero pequeño, asignándole el alias TINYINT(1), donde 1 representa verdadero y 0 representa falso. SQL Server utiliza BIT para datos de tipo booleano, almacenando 1 para verdadero y 0 para falso utilizando un solo bit por valor (aunque el almacenamiento real varía).
Entender las diferencias entre proveedores es importante al migrar esquemas entre bases de datos. Un BOOLEAN de PostgreSQL no tiene un equivalente directo en SQL Server; en su lugar, usaría BIT. El código de la aplicación que asume la entrada flexible de verdadero/falso de PostgreSQL (acepta "yes", "on", "1") podría fallar con los requisitos estrictos de 0/1 de SQL Server.
Ejemplos de definiciones booleanas:
Los tres son funcionalmente idénticos al almacenar valores verdadero/falso, pero los nombres de los tipos subyacentes difieren y el comportamiento de entrada/salida varía sutilmente.
La conversión de tipos convierte un valor de un tipo de datos a otro, lo cual es esencial cuando se deben combinar datos de diferentes fuentes o cuando se necesita cambiar la forma en que se interpreta un valor.
La conversión implícita ocurre automáticamente cuando la base de datos convierte tipos para hacer posible una operación. INSERT INTO table_name (int_column) VALUES ('123') podría convertir implícitamente la cadena '123' en el entero 123. La conversión implícita es conveniente pero arriesgada: la base de datos podría realizar conversiones que usted no deseaba, o la conversión podría fallar silenciosamente, produciendo resultados inesperados.
La conversión explícita mediante CAST o CONVERT le brinda un control preciso y aclara sus intenciones a otros desarrolladores. La conversión explícita evita sorpresas silenciosas y hace que el rendimiento de las consultas sea más predecible.
Las conversiones comunes incluyen la conversión de cadenas a números para realizar cálculos, la conversión de números a cadenas para la concatenación y la conversión a DATE o TIMESTAMP para filtrar por rangos temporales.
Ejemplo de uso de CAST:
Estas conversiones explícitas aclaran el código: cualquiera que lea la consulta comprende de inmediato que se está realizando la conversión y sabe exactamente qué tipo se produce.
MySQL utiliza TINYINT para valores booleanos (asignando el alias BOOLEAN a TINYINT(1)), VARCHAR para cadenas variables y BLOB para datos binarios. PostgreSQL admite BOOLEAN de forma nativa, TEXT para texto grande sin límites de tamaño y BYTEA para datos binarios. SQL Server utiliza INT y BIGINT como la mayoría de las bases de datos, VARCHAR para cadenas e IMAGE para datos binarios grandes. Oracle tiene NUMBER para valores numéricos, VARCHAR2 para cadenas (not VARCHAR) y BLOB para datos binarios.
Estas diferencias son importantes al migrar esquemas. Una columna TEXT de PostgreSQL puede contener cualquier cantidad de datos, pero TEXT de MySQL tiene un límite de 64 KB y requiere LONGTEXT para contenido más grande. Se necesita VARCHAR(MAX) de SQL Server para texto realmente grande, mientras que TEXT de PostgreSQL lo maneja directamente. El tipo NUMBER de Oracle es más flexible que los tipos numéricos de la mayoría de las bases de datos, lo que le permite especificar la precisión y la escala de manera diferente.
Consulte la documentación oficial de su base de datos antes de diseñar esquemas que deban ser portables. Pruebe sus datos reales con su sistema de base de datos de destino para detectar casos extremos en los que no se cumplan las suposiciones sobre el comportamiento de los tipos.
Prefiera tipos de precisión fija como DECIMAL para datos financieros, evitando por completo los tipos de punto flotante en los sistemas de contabilidad o facturación. La precisión financiera no es negociable, y la exactitud de DECIMAL vale el pequeño costo de rendimiento. Las organizaciones que crean sistemas de análisis en plataformas modernas de data warehouse priorizan cada vez más la selección adecuada del tipo de datos como base para la gobernanza y el rendimiento.
Evite el uso de cadenas para fechas o booleanos, aunque sea técnicamente posible. Almacenar fechas como VARCHAR dificulta la aritmética de fechas, evita que la base de datos optimice las consultas basadas en fechas y dificulta la validación. Almacenar booleanos como cadenas introduce ambigüedad (¿es "false" lo mismo que "no"?) y desperdicia almacenamiento. Utilice tipos nativos DATE, TIMESTAMP y BOOLEAN que están diseñados específicamente para estos valores.
Revise y optimice los tipos durante las auditorías de esquemas, especialmente cuando las bases de datos han existido durante años y los patrones de uso han cambiado. Una columna definida como VARCHAR(1000) por razones que ya no se aplican desperdicia espacio en cada fila. Utilice EXPLAIN PLAN o las herramientas de análisis de consultas de su base de datos para identificar consultas lentas causadas por elecciones de tipo incorrectas y luego realice una refactorización.
Documente sus elecciones de tipo, especialmente los casos extremos y las suposiciones. Un comentario que explique por qué una columna es TINYINT en lugar de INT evita que alguien la cambie más tarde debido a una comprensión incompleta. Esta documentación es particularmente importante para los tipos numéricos donde el rango importa.
CHAR almacena cadenas de longitud fija y siempre utiliza el tamaño total declarado, rellenando con espacios. VARCHAR almacena cadenas de longitud variable y utiliza solo el espacio necesario para los datos reales. CHAR es más eficiente para datos de tamaño fijo como códigos de país (siempre 2 letras), mientras que VARCHAR es más eficiente para datos de longitud variable como nombres. Los tipos de datos de cadena imponen reglas sobre la entrada de datos en las columnas SQL, y elegir entre CHAR y VARCHAR afecta tanto al almacenamiento como al rendimiento en su sistema de base de datos.
DECIMAL almacena valores exactos y evita errores de redondeo, lo que lo hace esencial para datos financieros donde la precisión importa. FLOAT almacena valores aproximados más rápido pero introduce artefactos de redondeo. Utilice DECIMAL para montos monetarios, mediciones científicas precisas y cálculos donde la exactitud sea auditable. Utilice FLOAT para aproximaciones, características de machine learning y computación científica donde se acepten pequeños errores. Elegir el tipo de datos correcto es fundamental para la integridad de los datos en los sistemas financieros.
Utilice DATE cuando solo necesite registrar la fecha del calendario sin información de la hora, como la fecha de nacimiento de un cliente o la fecha de una transacción. Utilice TIMESTAMP cuando necesite información temporal precisa que incluya horas, minutos y segundos, como marcas de tiempo de eventos o tiempos de finalización de transacciones. Los tipos de fecha y hora se utilizan para registrar cuándo ocurren los eventos, y seleccionar el tipo correcto simplifica las consultas y evita el desperdicio de almacenamiento.
Las longitudes máximas varían según la base de datos. VARCHAR normalmente admite longitudes de hasta 65,535 bytes en MySQL, ilimitadas en PostgreSQL y de hasta 8,000 bytes en SQL Server (o VARCHAR(MAX) para valores más grandes). Siempre consulte la documentación de su base de datos específica para conocer los límites exactos. Elegir los tipos adecuados puede mejorar la escalabilidad a largo plazo y evitar alcanzar límites de almacenamiento inesperados.
Almacene todas las marcas de tiempo en UTC para garantizar la coherencia y la comparabilidad. Convierta las marcas de tiempo a UTC antes de almacenarlas y vuelva a convertirlas a la zona horaria local del usuario al mostrarlas. Algunas bases de datos como PostgreSQL admiten TIMESTAMPTZ para gestionar automáticamente esta conversión. Un manejo coherente de las zonas horarias evita errores en los cálculos basados en el tiempo y hace que el orden de los eventos sea inequívoco.
Los valores UUID suelen utilizar BINARY(16) para el almacenamiento de tamaño fijo o CHAR(36) para la representación de cadena estándar que incluye guiones. Algunas bases de datos como PostgreSQL admiten tipos UUID nativos. INT o BIGINT funcionan para identificadores numéricos de incremento automático. Elija en función de su esquema de identificación: los identificadores numéricos secuenciales son sencillos pero facilitan la adivinación de identificadores, mientras que los UUID son aleatorios y adecuados para sistemas distribuidos.
Los tipos de datos más pequeños permiten alojar más filas en la caché de la CPU, lo que agiliza las consultas. Los índices son más eficaces en tipos numéricos del tamaño adecuado. La eficiencia del almacenamiento reduce la E/S de disco y mejora la latencia de las consultas. El rendimiento de las consultas mejora con el uso de tipos de datos del tamaño adecuado, y elegir el tipo más pequeño que contenga sus datos de forma segura mantiene las bases de datos rápidas y eficientes.
(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original
Suscríbete a nuestro blog y recibe las últimas publicaciones directamente en tu bandeja de entrada.