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!!
fuente
Respuestas:
¿Esto incluye:
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.
fuente
decimal(10,0)
lugar dechar
?decimal(10,0)
que tienes que rellenar los cerosUsamos 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
fuente
decimal(10,0)
entonces en lugar dechar
?Utilice CHAR (10) si solo almacena números de teléfono de EE. UU. Quite todo menos los dígitos.
fuente
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 ...
fuente
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
fuente
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.
fuente
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.
fuente
money
no 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 usardecimal(10,0)
?nvarchar con preprocesamiento para estandarizarlos tanto como sea posible. Probablemente desee extraer extensiones y almacenarlas en otro campo.
fuente
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.
fuente
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
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 '-'.
fuente
Utilice un
varchar
campo con una restricción de longitud.fuente
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.
fuente
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.
fuente
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
fuente
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.
fuente