database - significado - ¿Existe un estándar para almacenar números de teléfono normalizados en una base de datos?
database sql (17)
Encuentro que la mayoría de los formularios web permiten correctamente el código de país, el código de área, luego los 7 dígitos restantes, pero casi siempre olvidan permitir la entrada de una extensión. Esto casi siempre termina haciéndome palabras de enojo, ya que en el trabajo no tenemos una recepcionista, y mi ext. # Es necesaria para contactarme.
Tendría que verificarlo, pero creo que nuestro esquema DB es similar. Tenemos un código de país (puede ser predeterminado para EE. UU., No estoy seguro), código de área, 7 dígitos y extensión.
¿Cuál es una buena estructura de datos para almacenar números de teléfono en los campos de la base de datos? Estoy buscando algo que sea lo suficientemente flexible como para manejar números internacionales, y también algo que permita que las diversas partes del número sean consultadas de manera eficiente.
Editar: solo para aclarar el caso de uso aquí: actualmente almaceno números en un único campo varchar, y los dejo tal como los ingresó el cliente. Entonces, cuando el número es necesario por código, lo normalizo. El problema es que si quiero consultar unas pocas millones de filas para encontrar números de teléfono que coincidan, implica una función, como
where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2)
que es terriblemente ineficiente. También las consultas que buscan cosas como el código de área se vuelven extremadamente complicadas cuando se trata de un solo campo varchar.
[Editar]
La gente ha hecho muchas buenas sugerencias aquí, ¡gracias! Como actualización, esto es lo que estoy haciendo ahora: aún almaceno los números exactamente como fueron ingresados, en un campo varchar, pero en vez de normalizar cosas en tiempo de consulta, tengo un disparador que hace todo eso mientras se insertan los registros o actualizado Así que tengo ints o bigints para las partes que necesito consultar, y esos campos están indexados para hacer que las consultas se ejecuten más rápido.
Fácil de usar: +44 (0) 181 464 2542 normalizado: 00441814642542
El (0) no es válido en el formato internacional. Ver el estándar ITU-T E.123.
El formato "normalizado" no sería útil para los lectores de EE. UU. Ya que usan el 011 para el acceso internacional.
¿De dónde sacas los números de teléfono? Si los obtiene de parte de la red telefónica, obtendrá una cadena de dígitos y un tipo de número y plan, por ej.
441234567890 tipo / plan 0x11 (que significa internacional E.164)
En la mayoría de los casos, lo mejor que se puede hacer es almacenarlos como están y normalizarlos para su visualización, aunque el almacenamiento de números normalizados puede ser útil si desea utilizarlos como una clave única o similar.
¿Qué pasa con el almacenamiento de una columna de texto libre que muestra una versión fácil de usar del número de teléfono, luego una versión normalizada que elimina espacios, corchetes y expande ''+''. Por ejemplo:
Fácil de usar: +44 (0) 181 4642542
Normalizado: 00441814642542
¿Quizás almacenar las secciones del número de teléfono en diferentes columnas, permitiendo entradas en blanco o nulas?
Aquí está mi estructura propuesta, agradecería los comentarios:
El campo de la base de datos del teléfono debe ser un varchar (42) con el siguiente formato:
CountryCode - Número x Extensión
Entonces, por ejemplo, en los EE. UU., Podríamos tener:
1-2125551234x1234
Esto representaría un número de EE. UU. (Código de país 1) con código de área / número (212) 555 1234 y extensión 1234.
Al separar el código de país con un guion, el código de país queda claro para alguien que está leyendo detenidamente los datos. Esto no es estrictamente necesario porque los códigos de país son " códigos de prefijo " (puede leerlos de izquierda a derecha y siempre podrá determinar inequívocamente el país). Sin embargo, dado que los códigos de país tienen diferentes longitudes (entre 1 y 4 caracteres en este momento), no se puede distinguir fácilmente el código de país a menos que se utilice algún tipo de separador.
Utilizo una "x" para separar la extensión porque de lo contrario no sería posible (en muchos casos) averiguar cuál era el número y cuál era la extensión.
De esta forma, puede almacenar el número completo, incluido el código de país y la extensión, en un solo campo de base de datos, que luego puede usar para acelerar sus consultas, en lugar de unirse a una función definida por el usuario como lo ha estado haciendo hasta ahora. .
¿Por qué elegí un varchar (42)? Bueno, primero, los números de teléfono internacionales serán de diferentes longitudes, de ahí la "var". Estoy almacenando un guion y una "x", así que eso explica el "char", y de todos modos, no harás números aritméticos enteros en los números de teléfono (supongo) así que tiene poco sentido tratar de usar un tipo numérico . En cuanto a la longitud de 42, utilicé la longitud máxima posible de todos los campos sumados, basados en la respuesta de Adam Davis, y agregué 2 para el tablero y la ''x''.
Busque E.164. Básicamente, usted almacena el número de teléfono como un código que comienza con el prefijo del país y un sufijo pbx opcional. La pantalla es un problema de localización. La validación también se puede hacer, pero también es un problema de localización (basado en el prefijo del país).
Por ejemplo, +12125551212 + 202 se formateará en la configuración regional en_US como (212) 555-1212 x202. Tendría un formato diferente en en_GB
o de_DE
.
Hay bastante información sobre ITU-T E.164, pero es bastante críptica.
Creo que el texto libre (quizás varchar (25)) es el estándar más utilizado. Esto permitirá cualquier formato, ya sea nacional o internacional.
Supongo que el factor principal puede ser cómo estás consultando estos números y qué estás haciendo con ellos.
De acuerdo, de acuerdo con la información en esta página, aquí hay un comienzo en un validador de número de teléfono internacional:
function validatePhone(phoneNumber) {
var valid = true;
var stripped = phoneNumber.replace(/[/(/)/./-/ /+/x]/g, '''');
if(phoneNumber == ""){
valid = false;
}else if (isNaN(parseInt(stripped))) {
valid = false;
}else if (stripped.length > 40) {
valid = false;
}
return valid;
}
Basada en una secuencia de comandos de esta página: http://www.webcheatsheet.com/javascript/form_validation.php
El estándar para formatear números es e.164 , siempre debe almacenar números en este formato. Nunca debe permitir el número de extensión en el mismo campo con el número de teléfono, estos deben almacenarse por separado. En cuanto a numérico vs alfanumérico, depende de lo que vas a hacer con esa información.
En primer lugar, más allá del código de país, no existe un estándar real. Lo mejor que puede hacer es reconocer, por el código de país, a qué nación pertenece un número de teléfono particular y tratar con el resto del número de acuerdo con el formato de esa nación.
En general, sin embargo, el equipo del teléfono y tal está estandarizado, por lo que casi siempre puede dividir un número de teléfono dado en los siguientes componentes
- C Códigos de país de 1 a 10 dígitos (ahora 4 o menos, pero eso puede cambiar)
- Un código de área (Provincia / estado / región) codifica 0-10 dígitos (en realidad puede querer un campo de región y un campo de área por separado, en lugar de un código de área)
- E Código de intercambio (prefijo o interruptor) 0-10 dígitos
- L Número de línea 1-10 dígitos
Con este método, puede separar los números de forma tal que pueda encontrar, por ejemplo, personas que podrían estar cerca una de la otra porque tienen el mismo país, área y códigos de intercambio. Con los teléfonos celulares ya no es algo con lo que puedas contar.
Además, dentro de cada país existen diferentes estándares. Siempre puede depender de una (AAA) EEE-LLLL en los EE. UU., Pero en otro país puede tener intercambios en las ciudades (AAA) EE-LLL, y simplemente números de línea en áreas rurales (AAA) LLLL. Tendrá que comenzar en la parte superior de un árbol de alguna forma y formatearlo a medida que tenga información. Por ejemplo, el código de país 0 tiene un formato conocido para el resto del número, pero para el código de país 5432 puede que necesite examinar el código de área antes de comprender el resto del número.
Es posible que también desee manejar números de vanity
como (800) Lucky-Guy
, que requiere reconocer que, si es un número de EE. UU., Hay demasiados dígitos (y es posible que necesite una representación completa para fines publicitarios u otros) y que los EE. UU. las letras se asignan a los números de manera diferente que en Alemania.
También es posible que desee almacenar el número completo por separado como campo de texto (con internacionalización) para poder volver más tarde y volver a analizar los números a medida que cambian las cosas, o como copia de seguridad en caso de que alguien envíe un método incorrecto para analizar el formato de un país en particular y pierde información.
Encuentro que la mayoría de los formularios web permiten correctamente el código de país, el código de área, luego los 7 dígitos restantes, pero casi siempre olvidan permitir la entrada de una extensión. Esto casi siempre termina haciéndome palabras de enojo, ya que en el trabajo no tenemos una recepcionista, y mi ext. # Es necesaria para contactarme.
KISS: Me estoy cansando de muchos de los sitios web de EE. UU. Tienen un código ingeniosamente escrito para validar códigos postales y números de teléfono. Cuando escribo mi información de contacto de Noruega, que es perfectamente válida, me parece que a menudo es rechazada.
Déjalo en una cadena, a menos que tenga alguna necesidad específica de algo más avanzado.
La página de Wikipedia en E.164 debería decirle todo lo que necesita saber.
Me gustaría ir a un campo de texto libre y un campo que contiene una versión puramente numérica del número de teléfono. Dejaría la representación del número de teléfono al usuario y usaré el campo normalizado específicamente para las comparaciones de números de teléfono en aplicaciones basadas en TAPI o cuando trato de encontrar entradas dobles en un directorio telefónico. Por supuesto, no hace daño proporcionarle al usuario un esquema de entrada que agrega inteligencia como campos separados para el código de país (si es necesario), el código de área, el número de base y la extensión.
Personalmente, me gusta la idea de almacenar un número de teléfono varchar normalizado (por ejemplo, 9991234567) y, por supuesto, formatear ese número de teléfono en línea a medida que lo muestra.
De esta forma, todos los datos en su base de datos están "limpios" y sin formato
Utilicé 3 formas diferentes de almacenar números de teléfono según los requisitos de uso.
- Si el número se almacena solo para recuperación humana y no se utilizará para buscar su almacenado en un campo de tipo de cadena exactamente como lo ingresó el usuario.
- Si se va a buscar en el campo, se eliminarán los caracteres adicionales, como +, espacios y corchetes, etc. y el número restante se almacenará en un campo de tipo de cadena.
- Finalmente, si el número de teléfono va a ser utilizado por una computadora / aplicación de teléfono, entonces en este caso necesitaría ser ingresado y almacenado como un número de teléfono válido utilizable por el sistema, esta opción por supuesto, siendo la más difícil de codificar para.