database phone-number

database - Columnas de números de teléfono en una base de datos



phone-number (10)

En las últimas 3 compañías en las que he trabajado, las columnas del número de teléfono son de tipo varchar (n). La razón es que podrían querer almacenar extensiones (extensión 333). Pero en todos los casos, los caracteres "-" se eliminan al insertar y actualizar. No entiendo por qué los caracteres ".ext" están bien para almacenar, pero no el carácter "-". ¿Alguien más ha visto esto y qué explicación puedes pensar para hacerlo de esta manera? Si todo lo que desea almacenar son los números, ¿no es mejor que use un campo int? Por el contrario, si desea almacenar el número como una cadena / varchar, ¿por qué no mantener todos los caracteres y no molestarse con el formateo en la pantalla y la limpieza al escribir?

También estoy interesado en conocer otras formas en que se implementa el almacenamiento del número de teléfono en otros lugares.


Pelar algunos caracteres y permitir otros puede tener un impacto si la tabla de la base de datos va a manejar otro sistema, por ejemplo, telefonía IP de algún tipo. Dependiendo de los sistemas involucrados, puede ser legítimo tener el sufijo Etc.333, mientras que los desarrolladores pueden no haber contabilizado "-" en la cadena (y sí, estoy adivinando aquí ...)

En cuanto a almacenar como un varchar en lugar de un int, esto es simplemente sentido común para mí. Como se mencionó anteriormente, los ceros a la izquierda pueden ser despojados en un campo int, la consulta en un campo int puede realizar funciones matemáticas implícitas (que también podrían explicar la eliminación del texto "-", no desea ingresar 555-1234 y tener almacenado como -679, ¿verdad?)

En resumen, no sé el razonamiento exacto, pero puedo deducir algunas posibilidades.


Personalmente, no quitaría ninguno de los personajes, ya que dependiendo de dónde sea el número de teléfono, podría significar cosas diferentes. Deje el número de teléfono en el formato exacto en que fue ingresado, ya que obviamente esa es la forma en que la persona que lo ingresó está acostumbrada a verlo.


un punto con el almacenamiento de números de teléfono es un 0 líder.

por ejemplo: 01202 8765432

en una columna int, el 0 se eliminará, lo que hace que el número de teléfono no sea válido.

Me arriesgaría a adivinar - el cambio de espacios es porque en realidad no significan nada

eg: 123-456-789 = 123 456 789 = 123456789


¡Buen material! Parece que el punto principal es que el formato del número de teléfono no forma parte de los datos, sino que es un aspecto del país de origen. Sin embargo, al mantener la extensión como parte del número, uno podría estar rompiendo el modelo de separación del formato de los datos. Dudo que todos los países usen la misma sintaxis / formato para describir una extensión. Además, si la integración con un sistema telefónico es un requisito (posible), entonces podría ser mejor almacenar la extensión por separado y generar el mensaje como se espera. Pero Mark también señala que si eres coherente, probablemente no importe cómo lo almacenes, ya que también puedes consultarlo y procesarlo de manera consistente.

Gracias Eric por el enlace a la otra pregunta.


Lo que me gustaría hacer si sé que los números de teléfono solo van a estar dentro de una región específica, como Norteamérica, es cambiar la entrada en 4 campos. 3 para el código de área, 3 para el prefijo, 3 para la línea y tal vez 5 para la extensión. Luego inserto estos como 1 campo con ''-'' y tal vez una ''e'' para designar la extensión. Cualquier búsqueda por supuesto también necesita seguir el mismo proceso. Esto garantiza que obtenga datos más regulares e incluso permite que se use el número para hacer una llamada de teléfono, una vez que se eliminan la extensión y la extensión. También puedo volver a los 4 campos originales fácilmente.


Optaría por almacenar los dígitos como una cadena y agregar los diversos "()" y "-" en mi código de visualización. Se vuelve más difícil con números internacionales. Lo manejamos teniendo varios formatos de visualización "internacionalizados" dependiendo del país.


Prueba rápida: ¿vas a agregar / restar / multiplicar / dividir números de teléfono? Nop. De manera similar a los SSN, los números de teléfono son datos discretos que pueden contener números reales, por lo que un tipo de cadena es probablemente el más apropiado.


Realmente no importa cómo lo guardas, siempre y cuando sea consistente . La norma es eliminar los caracteres de formato, pero también puede almacenar el código de país, el código de área, el intercambio y la extensión por separado si necesita consultar esos valores. Nuevamente, el requisito es que sea consistente; de ​​lo contrario, consultar es un PITA.


Otra razón por la que se me ocurre no almacenar números de teléfono como ''números'' sino como cadenas de caracteres, es que a menudo una parte suficiente de la pila de software que usaría para acceder a la base de datos (PHP, lo estoy mirando) no admite enteros lo suficientemente grandes (de forma nativa) para poder almacenar algunos de los números de teléfono más antiguos y / o exóticos.

El número más grande que 32 bits puede llevar, sin signo, es 4294967295. Eso no funcionaría para cualquier número de teléfono móvil ruso, tome, por ejemplo, el número 4959261234.

Entonces usted tiene un inconveniente adicional de encontrar una manera de llevar datos numéricos de más de 32 bits. A pesar de que las bases de datos siempre han soportado enteros muy grandes, solo necesitas un enlace defectuoso en la cadena para obtener una parada espectacular. Como PHP, de nuevo.


Cuando un sistema telefónico automatizado usa un campo para hacer una llamada telefónica, es posible que no pueda decir qué caracteres debe usar y cuáles debe ignorar al marcar. Un ser humano puede ver un carácter "(" o ")" o "-" y saber que se consideran delimitadores que separan el código de área, npa y nxx del número de teléfono. Sin embargo, recuerde que cada personaje representa un patrón binario que, a menos que esté preprogramado para ignorar, se ingresaría mediante un marcador automático. Para explicar esto, es mejor almacenar el equivalente de solo los caracteres que un usuario presionaría en el auricular del teléfono y aún mejor que los valores individuales se almacenen en columnas separadas para que el marcador pueda usar campos individuales sin tener que analizar la cadena.

Incluso si no usa la automatización de marcado, es una buena práctica almacenar cosas que no necesita actualizar en el futuro. Es mucho más fácil agregar caracteres entre campos que quitarlos de cadenas.

En el comentario de usar un tipo de datos de cadena frente a entero como se indica anteriormente, las cadenas son la forma correcta de almacenar números de teléfono según las variaciones entre países. Sin embargo, hay una advertencia importante al respecto, ya que al agregar estadísticas para informar (es decir, SUMA de cuántos números o llamadas) las cadenas de caracteres son MUCHO más lentas de contar que los enteros. Para tener en cuenta esto, es importante agregar un número entero como columna de identidad que puede usar para contar en lugar del tipo de datos varchar o char field.