¿Qué tipo de datos se debe utilizar para almacenar números de teléfono en SQL Server 2005?

82

Necesito almacenar números de teléfono en una tabla. Sugiera qué tipo de datos debo utilizar. Espere. Siga leyendo antes de presionar responder.

Este campo debe indexarse ​​en gran medida, ya que los representantes de ventas pueden usar este campo para realizar búsquedas (incluida la búsqueda de caracteres comodín).

A partir de ahora, esperamos que los números de teléfono vengan en varios formatos (desde un archivo XML). ¿Tengo que escribir un analizador para convertir a un formato uniforme? Podría haber millones de datos (con duplicados) y no quiero inmovilizar los recursos del servidor (en actividades como preprocesar demasiado) cada vez que llegan algunos datos de origen.

Cualquier sugerencia es bienvenida.

Actualización: no tengo control sobre los datos de origen. Solo que la estructura del archivo xml es estándar. Me gustaría mantener el análisis xml al mínimo. Una vez que esté en la base de datos, la recuperación debería ser rápida. Una sugerencia loca por aquí es que incluso debería funcionar con la función Autocompletar de Ajax (para que los representantes de ventas puedan ver los que coinciden de inmediato). ¡¡DIOS MIO!!

Juan
fuente
Es posible que desee utilizar github.com/googlei18n/libphonenumber para analizar / limpiar los datos de origen.
Nicholas Hirras

Respuestas:

58

¿Esto incluye:

  • Números internacionales?
  • Extensiones?
  • ¿Otra información además del número real (como "preguntar por Bobby")?

Si todos estos son no, usaría un campo de 10 caracteres y eliminaría todos los datos no numéricos. Si el primero es un sí y los otros dos son no, usaría dos campos varchar (50), uno para la entrada original y otro con todos los datos no numéricos seccionados y usados ​​para la indexación. Si 2 o 3 son sí, creo que haría dos campos y algún tipo de analizador loco para determinar qué es la extensión u otros datos y tratarlos de manera adecuada. Por supuesto, podría evitar la segunda columna haciendo algo con el índice en el que elimine los caracteres adicionales al crear el índice, pero solo haría una segunda columna y probablemente haría la eliminación de caracteres con un disparador.

Actualización: para abordar el problema de AJAX, puede que no sea tan malo como cree. Si esta es de manera realista la forma principal en que se hace algo en la tabla, almacene solo los dígitos en una columna secundaria como dije, y luego haga que el índice de esa columna sea agrupado.

Kearns
fuente
Sí a todas las preguntas. No tengo control sobre los datos de origen. Algunas buenas sugerencias allí. Gracias.
John
12
Soy quisquilloso, pero un campo de 10 caracteres no cubriría la mayoría de los números móviles del Reino Unido y muchos números de teléfonos fijos del Reino Unido. Permitiría más de 10 incluso en EE. UU. Para permitir el escalado futuro de números de teléfono.
Jon Egerton
2
¿Por qué no en decimal(10,0)lugar de char?
Mr Anderson
1
@MrAnderson, creo que eso se debe a decimal(10,0)que tienes que rellenar los ceros
iniciales
Dependiendo de dónde te encuentres en el mundo, no creo que 10 caracteres sean lo suficientemente largos , como también lo destaca la respuesta de Brad.
Richardissimo
42

Usamos varchar (15) y ciertamente indexamos en ese campo.

La razón es que los estándares internacionales pueden admitir hasta 15 dígitos

Wikipedia - Formatos de números de teléfono

Si admite números internacionales, le recomiendo el almacenamiento por separado de un código de zona mundial o código de país para filtrar mejor las consultas de modo que no se encuentre analizando y verificando la longitud de los campos de su número de teléfono para limitar las llamadas devueltas a EE. UU. ejemplo

Brad Osterloo
fuente
2
Puede que esté pasando por alto algo obvio, pero ¿qué beneficio hay en usar un tipo de datos de caracteres para almacenar datos numéricos? Y si está almacenando más que datos numéricos (por ejemplo, los delimitadores), ¿no necesitaría más de 15 caracteres para almacenar un número formateado de 15 dígitos?
FtDRbwLXw6
13
@drrcknlsn la razón es el cero a la izquierda - algunos (la mayoría en algunos países) comienzan con un cero
Manse
15
@drrcknlsn Sé que este comentario tiene 2 años, pero en el caso de que alguien se encuentre con su comentario: por lo general, la regla general es que los tipos de datos enteros deben usarse para almacenar datos numéricos que tengan sentido para hacer matemáticas, y el resto son cadenas. Por ejemplo, agregar dos números de teléfono o multiplicar números SIN / SSN no tiene sentido, por lo que deben almacenarse como cadenas.
Marco Pietro Cirillo
2
@drrcknlsn ¿por qué no decimal(10,0)entonces en lugar de char?
Mr Anderson
@ Sr. A: Tal vez porque la longitud del número de teléfono puede variar de una región / país a otro. Rellenar con ceros a la izquierda crearía un problema de análisis adicional.
Trunk
4

Utilice CHAR (10) si solo almacena números de teléfono de EE. UU. Quite todo menos los dígitos.

Joseph Bui
fuente
3
Y sin extensiones
Chris Forrence
3

Probablemente me esté perdiendo lo obvio aquí, pero ¿no funcionaría bien un varchar lo suficientemente largo para su número de teléfono esperado más largo?

Si yo estoy perdiendo algo obvio, me gustaría que si alguien señalarlo ...

cori
fuente
3

Usaría un varchar (22). Lo suficientemente grande para contener un número de teléfono norteamericano con extensión. Debería eliminar todos los caracteres desagradables '(', ')', '-' o simplemente analizarlos todos en un formato uniforme.

Alex

Alex Fort
fuente
2

SQL Server 2005 está bastante bien optimizado para consultas de subcadenas para texto en campos varchar indexados. Para 2005, introdujeron nuevas estadísticas en el resumen de cadenas de los campos de índice. Esto ayuda significativamente con la búsqueda de texto completo.

Joseph Daigle
fuente
2

usar varchar es bastante ineficiente. use el tipo de dinero y cree un tipo de usuario declarado "número de teléfono" a partir de él, y cree una regla para permitir solo números positivos.

si lo declara como (19,4), incluso puede almacenar una extensión de 4 dígitos y ser lo suficientemente grande para números internacionales, y solo ocupa 9 bytes de almacenamiento. Además, los índices son rápidos.

fjleon
fuente
2
Grats. -1. Ingorancia y no lectura: ¿qué hay de% 233%? Este es un problema estándar y hay una solución estándar y NO es un número. Lo que elimina todo el formato, por cierto.
TomTom
@TomTom Si bien estoy de acuerdo moneyno es la respuesta, si no se requiere la búsqueda por subcadena (y me imagino que muchos no necesitan buscar un registro basado solo en una parte de un número de teléfono), ¿qué sería de malo usar decimal(10,0)?
Mr Anderson
1

nvarchar con preprocesamiento para estandarizarlos tanto como sea posible. Probablemente desee extraer extensiones y almacenarlas en otro campo.

John Sheehan
fuente
1

Normalice los datos y luego almacénelos como varchar. Normalizar puede ser complicado.

Eso debería ser un éxito único. Luego, cuando ingresa un nuevo registro, lo está comparando con los datos normalizados. Debería ser muy rápido.

Iain Holder
fuente
1

Dado que necesita adaptarse a muchos formatos de números de teléfono diferentes (y probablemente incluir cosas como extensiones, etc.), puede tener más sentido tratarlo como lo haría con cualquier otro varchar. Si pudiera controlar la entrada, podría adoptar una serie de enfoques para hacer que los datos sean más útiles, pero no suena así.

Una vez que decida simplemente tratarlo como cualquier otra cadena, puede concentrarse en superar los problemas inevitables relacionados con los datos incorrectos, el misterioso formato de números de teléfono y cualquier otra cosa que aparezca. El desafío será construir una buena estrategia de búsqueda para los datos y no cómo se almacenan en mi opinión. Siempre es una tarea difícil tener que lidiar con una gran cantidad de datos que no tenía control sobre la recopilación.


fuente
1

Utilice SSIS para extraer y procesar la información. De esa forma tendrá el procesamiento de los archivos XML separados de SQL Server. También puede hacer las transformaciones SSIS en un servidor separado si es necesario. Almacene los números de teléfono en un formato estándar usando VARCHAR. NVARCHAR sería innecesario ya que estamos hablando de números y tal vez un par de otros caracteres, como '+', '', '(', ')' y '-'.

Magnus Johansson
fuente
1

Utilice un varcharcampo con una restricción de longitud.

user13270
fuente
1

Es bastante común usar una "x" o "ext" para indicar extensiones, así que permita 15 caracteres (para soporte internacional completo) más 3 (para "ext") más 4 (para la extensión en sí) dando un total de 22 caracteres . Eso debería mantenerte a salvo.

Alternativamente, normalice en la entrada para que cualquier "ext" se traduzca a "x", dando un máximo de 20.

Rob G
fuente
1

Siempre es mejor tener tablas separadas para atributos de varios valores como el número de teléfono.

Como no tiene control sobre los datos de origen, puede analizar los datos del archivo XML y convertirlos al formato adecuado para que no haya ningún problema con los formatos de un país en particular y almacenarlos en una tabla separada para que la indexación y la recuperación de ambos será eficiente .

Gracias.

Jayghosh Wankar
fuente
No responde la pregunta completamente.
Smart Manoj
1

Me doy cuenta de que este hilo es antiguo, pero vale la pena mencionar la ventaja de almacenarlo como un tipo numérico para fines de formato, específicamente en .NET framework.

ES DECIR

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
Sr. Tripodi
fuente
0

Use el tipo de datos largo en su lugar ... no use int porque solo permite números enteros entre -32.768 y 32.767 pero si usa el tipo de datos largo, puede insertar números entre -2.147.483.648 y 2.147.483.647.

Ej Manalo Carbona
fuente
1
Esto está bien, pero no puede almacenar números internacionales con código de país, ya que algunos números comienzan con código de país. Por ejemplo: 0094777123123, mejor use un campo varchar (15) con alguna validación de expresiones regulares.
Bubashan_kushan