Cuando hablamos de trabajar con datos de texto en PostgreSQL, tenemos tres protagonistas principales: CHAR, VARCHAR y TEXT. Cada uno tiene sus propias características, ventajas y matices. Vamos a verlos uno por uno.
CHAR(n)
CHAR, o character, es una cadena de longitud fija n. Si la cadena de datos tiene menos caracteres de los indicados, se rellena automáticamente con espacios.
Ejemplo:
| id | código - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
Este tipo es útil cuando todas las cadenas deben tener la misma longitud (por ejemplo, códigos, códigos de barras o identificadores de longitud fija).
Pero si trabajas con texto de longitud variable, los espacios extra solo ocupan espacio en la base de datos para nada.
VARCHAR(n)
VARCHAR, o variable character, está pensado para guardar cadenas de longitud variable con un límite máximo de n caracteres.
Ejemplo:
| id | usuario - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
Este tipo usa el espacio de forma eficiente porque solo guarda el texto real. La pega es que tienes que poner un límite de longitud. Si la cadena supera ese límite, la base de datos lanzará un error.
TEXT
TEXT es un tipo de dato de cadena sin límite de longitud. Se usa mucho cuando no tienes claro hasta qué tamaño puede crecer el texto.
Ejemplo:
| id | contenido - TEXT |
|---|---|
| 1 | ''Esto es un texto largo. ¡Sin límites!'' |
Ventajas: puedes guardar textos de cualquier longitud sin preocuparte por límites.
Desventajas: la falta de límites puede hacer que la base de datos se use de forma poco eficiente si los datos de texto empiezan a crecer mucho.
Comparación de tipos de datos de texto
Cuando trabajas con texto, es importante saber qué tipo de dato va mejor para cada caso. Aquí tienes las diferencias principales entre CHAR, VARCHAR y TEXT:
| Tipo de dato | Longitud | Rendimiento | ¿Cuándo usar? |
|---|---|---|---|
CHAR(n) |
Fija | Más rápido para cadenas de longitud fija | Para códigos de longitud fija (por ejemplo, ISO) |
VARCHAR(n) |
Longitud máxima n |
Más rápido que TEXT si hay límite de longitud |
Para cadenas de longitud variable con un máximo conocido |
TEXT |
Ilimitada | El más versátil | Para textos largos cuyo tamaño es difícil de predecir |
Ejemplos prácticos de uso
Vale, vamos a ver cómo usar estos tipos de datos en situaciones reales.
Ejemplo 1: Usar CHAR para códigos de longitud fija
Imagina que trabajas con una base de datos donde tienes que guardar los códigos de ciudades según el estándar ISO 3166-1 alpha-3. Cada código debe tener exactamente 3 caracteres.
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
Aquí CHAR(3) es perfecto porque cada código ISO de ciudad tiene longitud fija.
Ejemplo 2: Usar VARCHAR para nombres de usuario
El nombre de usuario es un caso ideal para VARCHAR. Normalmente tiene longitud variable, pero podemos suponer que nunca superará los 50 caracteres.
| user_id | username - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
VARCHAR en este caso ahorra espacio porque la longitud real de la cadena puede ser menor de 50 caracteres.
Ejemplo 3: Usar TEXT para guardar descripciones
Imagina que tienes un blog donde cada post necesita una descripción de texto grande. Aquí la mejor opción es TEXT.
| post_id | title - VARCHAR(100) | content - TEXT |
|---|---|---|
| 1 | Post 1 | Este es un contenido de post de blog muy largo que sigue y sigue... |
Si nunca sabes de antemano cuánto va a medir el texto, TEXT es ideal.
4. Más detalles y trampas
Al trabajar con tipos de datos de texto hay algunos detalles que deberías tener en cuenta para evitar errores típicos.
Problema: CHAR añade espacios
Si intentas comparar cadenas en un campo CHAR sin tener en cuenta los espacios añadidos, puedes llevarte sorpresas.
SELECT * FROM cities WHERE iso_code = 'NYC';
-- No devuelve nada si no quitas los espacios
Cómo arreglarlo: Usa la función TRIM() para quitar los espacios.
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
Problema: Los límites de longitud en VARCHAR pueden dar errores
Si intentas insertar en un campo VARCHAR una cadena que supera el máximo, la base de datos lanzará un error.
INSERT INTO users (username, email) VALUES ('Un_nombre_de_usuario_demasiado_largo_para_el_campo', 'test@example.com');
-- Error
Cómo arreglarlo: Asegúrate de que el límite de longitud (n) se ajusta a lo que necesitas. O usa TEXT para evitar límites.
Problema: TEXT puede hacer crecer tu base
TEXT guarda datos sin límite, lo que puede hacer que las tablas crezcan demasiado y que indexarlas sea más complicado.
Cómo evitarlo: Si piensas indexar mucho una columna TEXT, plantéate usar un VARCHAR limitado.
GO TO FULL VERSION