Pregunta

Quiero número de teléfono de entrada en un formulario, incluyendo el código de país, de extensión

create table if not exists employee(    `   
      country_code_tel   int(11),
      tel_number         int(10),
      extension          int(10),
      mobile             bigint(20)
);

Si tel_number es mayor que 15 bits, que tipo de datos se pueden utilizar, será mejor uso Bigint(20)?

create table address(
      address           varchar(255),  
      city              varchar(255),
      country           varchar(255),
      post_code         int(11)
);

Por ejemplo, si tengo un código de país para Canadá puedo usar 2 o 002. ¿Qué es mejor para el procesamiento?

Gracias por su consejo.

¿Fue útil?

Solución

Bueno, personalmente no utilizo tipo de datos numérico para almacenar números de teléfono o información relacionada.

¿Cómo almacena un número 001234567 decir? Se va a terminar como 1234567, perdiendo los ceros a la izquierda.

Por supuesto, siempre puede izquierda-pad hacia arriba, pero eso siempre y cuando se sabe exactamente cuántos dígitos del número debe ser.

Esto no responde a todo su correo,
Sólo mis 2 centavos de dólar

Otros consejos

En realidad se puede utilizar un varchar de un número de teléfono. No es necesario un int porque no se va a realizar operaciones aritméticas con los números.

guardarlas como dos campos de números de teléfono -. Un "número" y una "máscara", como tipos TinyText que no necesitan más de 255 artículos

Antes de almacenar los archivos que analizar el número de teléfono para obtener el formato que se ha utilizado y que crea la máscara, entonces se almacena el número de un solo dígitos por ejemplo.

Entrada: (0123) 456 7890
Número: 01234567890
Máscara: (nnnn)_nnn_nnnn

En teoría, esto nos permite realizar búsquedas de comparación en el campo Número tales como conseguir todos los números de teléfono que comienzan con un código de área específica, sin tener que preocuparse de cómo era la entrada por los usuarios

Por lo general almacenar números de teléfono como un BIGINT en formato E164.

E164 nunca se inicia con un 0, con los primeros dígitos es el código de país.

+441234567890
+44 (0)1234 567890
01234 567890

etc. se almacena como 441234567890.

i usaría un varchar de números de teléfono. de esa manera también se puede almacenar y + (), que a veces se ve en los números de tel (como usted ha mencionado usted mismo). y usted no tiene que preocuparse de agotar todos los bits en números enteros.

No estoy seguro de si es una buena idea usar números enteros en absoluto. Algunos números pueden contener caracteres especiales (#, como parte de la extensión, por ejemplo) que debe ser capaz de manejar también. Por lo tanto se recomienda usar varchars lugar.

Si el almacenamiento de menos de 1 mil registros, y el alto rendimiento no es un problema ir a varchar (20) / char (20) de otro modo he encontrado que incluso para el almacenamiento de 100 milones de teléfonos de negocios globales o teléfonos personales, int es mejor . Motivo:. Llave más pequeña -> lectura más alta / escritura de velocidad, también puede permitir que el formato de duplicados

1 teléfono en char (20) = 20 bytes vs 8 bytes bigint (o 10 vs 4 bytes int para teléfonos locales, hasta 9 dígitos), menos entradas pueden entrar en el bloque de índice => más bloques => más búsquedas, ver este para obtener más información (writen para MySQL pero debe ser cierto para otras bases de datos relacionales).

Este es un ejemplo de tablas de teléfono:

CREATE TABLE `phoneNrs` (   
    `internationalTelNr` bigint(20) unsigned NOT NULL COMMENT 'full number, no leading 00 or +, up to 19 digits, E164 format',
    `format` varchar(40) NOT NULL COMMENT 'ex: (+NN) NNN NNN NNN, optional',
    PRIMARY KEY (`internationalTelNr`)
    )
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin

o con el procesamiento / la división antes de inserto (2 + 2 + 4 + 1 = 9 bytes)

CREATE TABLE `phoneNrs` (   
    `countryPrefix` SMALLINT unsigned NOT NULL COMMENT 'countryCode with no leading 00 or +, up to 4 digits',
    `countyPrefix` SMALLINT unsigned NOT NULL COMMENT 'countyCode with no leading 0, could be missing for short number format, up to 4 digits',
    `localTelNr` int unsigned NOT NULL COMMENT 'local number, up to 9 digits',
    `localLeadingZeros` tinyint unsigned NOT NULL COMMENT 'used to reconstruct leading 0, IF(localLeadingZeros>0;LPAD(localTelNr,localLeadingZeros+LENGTH(localTelNr),'0');localTelNr)',
    PRIMARY KEY (`countryPrefix`,`countyPrefix`,`localLeadingZeros`,`localTelNr`)  -- ordered for fast inserts
) 
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
;

También "el número de teléfono no es un número", en mi opinión, es en relación con el tipo de números de teléfono. Si estamos hablando de una agenda telefónica interna, a continuación, las cadenas están muy bien, ya que el usuario puede desear almacenar Códigos GSM Hash . Si va a almacenar E164 móviles, bigint es la mejor opción.

Considere la normalización a E.164 formato. Para el pleno apoyo internacional, que había necesidad de un VARCHAR de 15 dígitos.

Consulte recomendación de Twilio para obtener más información sobre la localización de números de teléfono.

INT (10) no significa un número de 10 dígitos, significa un número entero con un ancho de muestra de 10 dígitos. El valor máximo para un INT en MySQL es 2147483647 (o 4294967295 si sin signo).

  

Puede utilizar un BIGINT en lugar de INT para almacenarla como un valor numérico. Utilizando   BIGINT le ahorrará 3 bytes por fila sobre VARCHAR (10).

Para almacenar "País + área + número por separado". Puede intentar usar un VARCHAR (20), esto le permite la capacidad de almacenar números de teléfono internacionales adecuadamente, si se presenta esa necesidad.

varchar o texto deben ser los mejores tipos de datos para almacenar los números de teléfono móvil, supongo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top