tipo de datos mysql para número de teléfono y dirección


Quiero ingresar el número de teléfono en un formulario, incluido el código de país, la 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 de 15 bits, ¿qué tipo de datos puedo usar, será mejor que use 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. ¿Cuál es mejor para el procesamiento?

Gracias por su consejo.

Author: Matt, 2009-12-04

10 answers

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

¿Cómo se almacena un número decir 001234567? Terminará como 1234567, perdiendo los ceros iniciales.

Por supuesto, siempre puedes colocarlo a la izquierda, pero siempre que sepas exactamente cuántos dígitos debe tener el número.

Esto no responde a todo tu post,
Solo mis 2 centavos

 65
Author: o.k.w,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 11:06:25

En realidad se puede utilizar un varchar para un número de teléfono. No necesita un int porque no va a realizar aritmética sobre los números.

 45
Author: Vincent Ramdhanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 11:05:31

Almacenarlos como dos campos para números de teléfono - un "número" y una "máscara" como TinyText tipos que no necesitan más de 255 elementos.

Antes de almacenar los archivos analizamos el número de teléfono para obtener el formato que se ha utilizado y que crea la máscara, luego almacenamos el número a solo dígitos, por ejemplo,

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

Teóricamente esto nos permite realizar búsquedas de comparación en el campo de Número, como obtener todos los teléfonos números que comienzan con un código de área específico, sin tener que preocuparse de cómo fue introducido por los usuarios

 31
Author: Dan Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-31 17:37:04

Suelo almacenar números de teléfono como un BIGINT en formato E164.

E164 nunca comienza con un 0, siendo los primeros dígitos el código del país.

+441234567890
+44 (0)1234 567890
01234 567890

Etc. se almacenaría como 441234567890.

 24
Author: Curon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-11 10:13:10

Usaría un varchar para los números de teléfono. de esa manera también puede almacenar + y (), que a veces se ve en números tel (como usted mismo mencionó). y no tienes que preocuparte por usar todos los bits en enteros.

 7
Author: kon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 11:06:15

No estoy seguro de si es una buena idea usar enteros en absoluto. Algunos números pueden contener caracteres especiales (#como parte de la extensión, por ejemplo) que también debería ser capaz de manejar. Así que sugeriría usar varchars en su lugar.

 5
Author: nfechner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 11:06:15

Si el almacenamiento de menos de 1 mil registros, y el alto rendimiento no es un problema ir para varchar(20)/char(20) de lo contrario he encontrado que para almacenar incluso 100 millones de teléfonos de negocios globales o teléfonos personales, int es mejor. Razón: tecla más pequeña - > mayor velocidad de lectura / escritura, también el formato puede permitir 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 ingresar el bloque de índice = > más bloques = > más búsquedas, ver this para más información (escrito para Mysql pero debería ser cierto para otras bases de datos Relacionales).

Aquí hay un ejemplo de tablas telefónicas:

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 procesamiento / división antes de insertar (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 relativo al tipo de números de teléfono. Si estamos hablando de una agenda interna móvil, entonces las cadenas están bien, ya que el usuario puede desear almacenar Códigos Hash GSM. Si almacenando E164 teléfonos, bigint es la mejor opción.

 3
Author: Stefan Rogin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-24 14:28:22

Considere la posibilidad de normalizar al formato E. 164. Para un soporte internacional completo, necesitarías un VARCHAR de 15 dígitos.

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

 3
Author: 00500005,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-06 02:09:16

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

Puede usar un BIGINT en lugar de INT para almacenarlo como numérico. Utilizar 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 almacenar números de teléfono internacionales correctamente, si es necesario.

 2
Author: Irshad Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-09 11:06:37

Varchar o text deberían ser los mejores tipos de datos para almacenar números móviles, supongo.

 1
Author: abhinawbharat04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-04 05:37:03