Diseño de Base de Datos: ¿Por Qué los Números de Teléfono Deben Almacenarse como Cadenas?

En prácticamente todos los sistemas de base de datos, un campo de número de teléfono debe usar un tipo de datos cadena (VARCHAR/TEXT) — nunca numérico (INT, BIGINT, DECIMAL).

Razones

  1. Caracteres de formato: Paréntesis, guiones, espacios, puntos, signos más — por ejemplo, +1 (555) 123-4567, 011-44-20-7123-4567.
  2. Ceros iniciales importan: Muchos países tienen ceros iniciales significativos (por ejemplo, Reino Unido 020, Italia 06). Los tipos numéricos los eliminan.
  3. Códigos de país y extensiones: +44 20 7123 4567 ext. 123 — alfanumérico "ext." o "x".
  4. Variabilidad de longitud: 4–15+ dígitos según ITU-T E.164; los límites numéricos (BIGINT máximo 19 dígitos) riesgan desbordamiento con formato.
  5. Códigos de marcado no dígitos: *, #, pausas (,), esperas (;) en cadenas de marcado.
  6. Búsqueda/Indexación: Patrones LIKE, coincidencias parciales, normalización E.164 — todas son operaciones de cadena.

Esquema de mejores prácticas

CREATE TABLE contacts (
 id BIGSERIAL PRIMARY KEY,
 phone_e164 VARCHAR(20) NOT NULL, -- normalizado: +15551234567
 phone_display VARCHAR(30), -- formateado para UI: (555) 123-4567
 phone_type VARCHAR(10), -- móvil, línea fija, voip, fax
 extension VARCHAR(10), -- opcional
 UNIQUE (phone_e164)
);

Consejo de normalización

Almacena dos columnas: un phone_e164 canónico (solo dígitos, con + inicial) para indexación/búsquedas, y un phone_display para el formato visible al usuario. Elimina todos los no dígitos en la entrada; aplica libphonenumber (librería de Google) para validación/formato.