If storing less then 1 mil records, and high performance is not an issue go for varchar(20)/char(20) otherwise I’ve found that for storing even 100 milion global business phones or personal phones, int is best. Reason : smaller key -> higher read/write speed, also formatting can allow for duplicates.
1 phone in char(20) = 20 bytes vs 8 bytes bigint
(or 10 vs 4 bytes int
for local phones, up to 9 digits) , less entries can enter the index block => more blocks => more searches, see this for more info (writen for Mysql but it should be true for other Relational Databases).
Here is an example of phone tables:
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
or with processing/splitting before insert (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
;
Also «the phone number is not a number», in my opinion is relative to the type of phone numbers. If we’re talking of an internal mobile phoneBook, then strings are fine, as the user may wish to store GSM Hash Codes. If storing E164 phones, bigint is the best option.
If storing less then 1 mil records, and high performance is not an issue go for varchar(20)/char(20) otherwise I’ve found that for storing even 100 milion global business phones or personal phones, int is best. Reason : smaller key -> higher read/write speed, also formatting can allow for duplicates.
1 phone in char(20) = 20 bytes vs 8 bytes bigint
(or 10 vs 4 bytes int
for local phones, up to 9 digits) , less entries can enter the index block => more blocks => more searches, see this for more info (writen for Mysql but it should be true for other Relational Databases).
Here is an example of phone tables:
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
or with processing/splitting before insert (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
;
Also «the phone number is not a number», in my opinion is relative to the type of phone numbers. If we’re talking of an internal mobile phoneBook, then strings are fine, as the user may wish to store GSM Hash Codes. If storing E164 phones, bigint is the best option.
Главная / Web / MySQL / Хранение номеров телефонов в Б…
Хранение номеров телефонов в БД
Хранение номеров телефонов в базе данных MySQL не такая уж тривиальная задача, как может показаться на первый взгляд. Один из первых вопросов при проектировании БД: какой тип ячейки БД использовать? Цифровое поле, например INT в MySQL не подходит для этих целей, так как номера некоторых телефонов (например мобильные номера в Украине) могут начинаться с нуля, а следовательно, если попытаться сохранить такой номер как число — ведущий ноль (нули) будут потеряны. Для хранения номеров телефонов лучше всего использовать текстовый тип столбца: CHAR.
Чтобы ускорить поиск по текстовым данным имеющим различную длину, в отдельном индексируемом цифровом столбце (TINYINT) можно хранить длину номера телефона и использовать её в условиях поиска — отсекать лишние номера при поиске. Но такая реализация базы данных нужна только при очень больших объемах телефонных номеров и в большинстве случаев её можно не использовать.
Если планируется хранение номеров телефонов в месте с кодом города и страны — лучше всего разделить эти данные на 4 отдельных столбца: код1, код2, номер телефона, полный номер телефона (код1, код2, номер).
Код1 — это, в основном, код страны (+20 — Египет, +380 — Украина и т.д.), но некоторые первичные коды телефонов могут и не иметь привязки к стране, например: 388 — European Telephony Numbering Space (Europe-wide services); 870 — Inmarsat «SNAC» service и т.д. Поэтому называть такую колонку country_code или подобным образом логически не правильно. Помимо всего прочего один первичный код может принадлежать нескольким странам: +1 — Америка, Канада и другие; 7 — Россия, Казахстан и т.д. Подробнее о таких кодах можно прочитать тут: Географические коды телефонных номеров. Хранить данные о первичном коде телефонного номера можно и в цифровом формате, так как все такие коды не могут начинаться с нуля, но исходя из соображения, что стандарт в будущем может поменяться — безопаснее сразу хранить такую информацию в текстовом виде. Максимальное количество символов Код1 — пять.
Код2 может быть кодом города, мобильного оператора или чего-нибудь еще, соответственно mob_code, city_code не являются логичными названиями для таких данных. Следует отметить, что в некоторых странах такие коды, возможно, могут начинаться и с нуля, поэтому выбор типа данных такого столбца — очевиден. Максимальное количество символов в таком столбце, скорее всего, не будет более пяти.
Номер телефона — об этом столбце написано в начале статьи. Кол-во символов в таком номере, обычно не превышает 7 штук.
Полный номер телефона содержит в себе информацию столбцов БД MySQL Код1, Код2 и Номер телефона. Этот столбец существенно упростит проверку на дублирующиеся номера. Тип и размер данных в нем высчитывается на основании колонок Код1, Код2 и Номер телефона.
Если планируется привязка нескольких номеров телефонов к одной организации, в таблице базы данных следует предусмотреть колонку с идентификатором фирмы (firm_id) и колонку порядковый номер телефона (number). Это решение очень поможет в составлении легковесных SQL запросов, когда нужно выводить список многих организаций с одним (например: основным) номером телефона.
Вывести только 1 номер телефона для всех фирм из БД
SELECT f.firm, p.phone
FROM table_firm AS f
LEFT JOIN table_phone AS p ON (f.id = p.firm_id AND p.number = 1)
Колонка порядковый номер должна содержать последовательные номера, начинающиеся с единицы, без разрывов: 1,2,3.
Хранение номеров телефонов, зачастую, подразумевает и сопутствующую их привязку к персональной информации — ФИО, название организации и т.д., а для этого, в свою очередь во многих странах требуются специальные разрешения, регистрации баз данных и т.п.
Хранение номеров телефонов в виде хеша
Если номер телефона нужен только для подтверждения регистрации пользователя — как средство защиты от ботов и мультиаккаунтов можно использовать следующую схему. Номер хранится в открытом виде только до подтверждения регистрации. После подтверждения создается и записывается в БД взломоустойчивый хеш номера телефона, а сам номер удаляется:
Пример относительно взломоустойчивого хеша на PHP
$hash = md5(md5($phone_number).‘saltBLF@#$%^’);
При необходимости восстановления пароля пользователя через мобильный телефон, отослав на него код активации, нужно запросить через форму у пользователя его номер телефона, вычислить хеш, сравнить с тем что в БД и выслать на него инструкции по активации.
Опубликовано: 2013/03/20
HTML-код ссылки на эту страницу:
<a href=»https://petrenco.com/mysql.php?txt=168″ target=»_blank»>Хранение номеров телефонов в БД</a>
27668
- Learning About MySQL Data Types
- Use
CHAR
to Store Phone Numbers in MySQL - Use
TINYTEXT
to Store Phone Numbers in MySQL - Use
VARCHAR
to Store Phone Numbers in MySQL
MySQL offers various convenient data types for storing expected input to its databases. Knowledge of the correct datatype for storing peculiar data is key to ensuring an optimized and efficient database.
This tutorial illustrates the formatting and storage of phone numbers in a MySQL database.
Learning About MySQL Data Types
MySQL generally has three data types:
- Numeric (
INT
,BIT
,FLOAT
, etc.) - String (
CHAR
,VARCHAR
,TEXT
, etc.) - Date and Time (
DATE
,DATETIME
,TIMESTAMP
, etc.)
These generalized datatypes further have sub-types for specific cases of data handling in the database.
Check out this reference from w3schools on various RDBMS (Relational Database Management System) datatypes for further reading.
In handling phone numbers, one may be quick to consider using a numeric data type. However, problems could arise as phone numbers come in various formats (country codes, delimiters, etc.) and have special characters.
Since phone numbers are at a maximum of fifteen (15) digits in length, according to the International Telecommunications Union, a string type of CHAR
, VARCHAR
, or TINYTEXT
are the best considerations.
CHAR
and TINYTEXT
have an upper limit of two-hundred-and-fifty-five (255) characters, while VARCHAR
uses dynamic memory allocation for storing data up to a defined limit between 0 and 65535.
Let us take a few examples of phone number storage with each data type to decide the most appropriate choice.
Use CHAR
to Store Phone Numbers in MySQL
The CHAR
datatype (short for character) can store strings of fixed length between 0 and 255 characters. A column implementing CHAR can specify an upper limit constraint between 0 and 255, and MySQL expects every string in that column to be of the same size.
MySQL pads the remainder of the space with blanks when inputting a lower-length string than the specified constraint.
For example, if a table column specifies a CHAR data type with a size constraint of thirty characters (30), passing a value of 10 characters still takes up the space of 30 characters (10 data characters and 20 blanks).
A further discussion on this is available via this MySQL official documentation.
To illustrate, let us create a sample registration system database.
-- Initializing
CREATE DATABASE new_registration_db;
USE new_registration_db;
-- CREATING TABLES
CREATE TABLE registered_users (
id INT AUTO_INCREMENT,
username VARCHAR (255) NOT NULL,
email VARCHAR(255),
phone CHAR (15) NOT NULL,
PRIMARY KEY(id)
);
-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA
INSERT INTO registered_users(username, email, phone) Values
('Mark Laurent', 'MarkRLaurent@teleworm.us','+1 908-204-0495'),
('Patricia Todd', 'PatriciaJTodd@teleworm.us','+1 801-752-2367'),
('Victoria McDonald', 'VictoriaAMcDonald@dayrep.com', '+1 608-299-8640'),
('Vin Petrol', 'vin_not_diesel@crudemail.com','+1 870-381-6967');
Output:
1 row(s) affected
0 row(s) affected
0 row(s) affected
4 row(s) affected Records: 4 Duplicates: 0 Warnings: 0
Now, let us preview the resulting table.
SELECT * FROM registered_users; -- Checking the table
Output:
id username email phone
1 Mark Laurent MarkRLaurent@teleworm.us +1 908-204-0495
2 Patricia Todd PatriciaJTodd@teleworm.us +1 801-752-2367
3 Victoria McDonald VictoriaAMcDonald@dayrep.com +1 608-299-8640
4 Vin Petrol vin_not_diesel@crudemail.com +1 870-381-6967
-----------------------------------------------------------------------------------------
4 row(s) returned
Here, since the phone number is of a fixed length of 15 characters, the CHAR datatype will offer efficient storage. Also, it is indexable for filtering purposes.
However, the CHAR datatype may not efficiently manage memory for applications that take phone numbers of variable size (a global application) due to the padding of blanks, as earlier discussed.
Use TINYTEXT
to Store Phone Numbers in MySQL
The TINYTEXT
datatype is the smallest of the TEXT-type datatypes. It has the same memory constraints as a CHAR
datatype between 0 and 255 characters.
However, unlike CHAR, it can dynamically allocate space to a passed value according to its character length. Hence, it offers better memory efficiency than the CHAR for this example of storing phone numbers.
It does have the downside of not having a default value making it non-indexable for sorting or aggregation.
Now, let us redo the previous example using TINYTEXT.
-- CREATING TABLES
CREATE TABLE registered_users2 (
id INT AUTO_INCREMENT,
username VARCHAR (255) NOT NULL,
email VARCHAR(255),
phone TINYTEXT NOT NULL,
PRIMARY KEY(id)
);
-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA
INSERT INTO registered_users2(username, email, phone) Values
('Mark Laurent', 'MarkRLaurent@teleworm.us','+1 908-204-0495'),
('Patricia Todd', 'PatriciaJTodd@teleworm.us','+1 801-752-2367'),
('Victoria McDonald', 'VictoriaAMcDonald@dayrep.com', '+1 608-299-8640'),
('Vin Petrol', 'vin_not_diesel@crudemail.com','+1 870-381-6967');
SELECT * FROM registered_users2; -- Checking the table
Output:
id username email phone
1 Mark Laurent MarkRLaurent@teleworm.us +1 908-204-0495
2 Patricia Todd PatriciaJTodd@teleworm.us +1 801-752-2367
3 Victoria McDonald VictoriaAMcDonald@dayrep.com +1 608-299-8640
4 Vin Petrol vin_not_diesel@crudemail.com +1 870-381-6967
-----------------------------------------------------------------------------------------
0 row(s) affected
4 row(s) affected Records: 4 Duplicates: 0 Warnings: 0
4 row(s) returned
We get an expected result. Check this reference for extra information on the MySQL TINYTEXT and other TEXT datatypes.
Use VARCHAR
to Store Phone Numbers in MySQL
The final suggested method for handling phone numbers in MySQL is by using the VARCHAR
data type. VARCHAR offers the flexibility of dynamic memory allocation when the phone number length will vary across database users.
It typically allocates two (2) extra bytes for storing length information. Hence, if a character of length six (6) is stored, a total memory allocation of 8 bytes is required for VARCHAR.
Columns specifying VARCHAR datatypes are also indexable for implementing sorting, aggregation, and primary/foreign key constraints.
Let us create a third table implementing VARCHAR for phone number allocation.
-- CREATING TABLES
CREATE TABLE registered_users3 (
id INT AUTO_INCREMENT,
username VARCHAR (255) NOT NULL,
email VARCHAR(255),
phone VARCHAR (15) NOT NULL,
PRIMARY KEY(id)
);
-- POPULATING THE TABLE WITH SAMPLE REGISTRATION DATA
INSERT INTO registered_users3(username, email, phone) Values
('Mark Laurent', 'MarkRLaurent@teleworm.us','+1 908-204-0495'),
('Patricia Todd', 'PatriciaJTodd@teleworm.us','+1 801-752-2367'),
('Victoria McDonald', 'VictoriaAMcDonald@dayrep.com', '+1 608-299-8640'),
('Vin Petrol', 'vin_not_diesel@crudemail.com','+1 870-381-6967');
SELECT * FROM registered_users3; -- Checking the table
Output:
id username email phone
1 Mark Laurent MarkRLaurent@teleworm.us +1 908-204-0495
2 Patricia Todd PatriciaJTodd@teleworm.us +1 801-752-2367
3 Victoria McDonald VictoriaAMcDonald@dayrep.com +1 608-299-8640
4 Vin Petrol vin_not_diesel@crudemail.com +1 870-381-6967
-----------------------------------------------------------------------------------------
0 row(s) affected
4 row(s) affected Records: 4 Duplicates: 0 Warnings: 0
4 row(s) returned
Implementing either of the three described datatypes is sufficient for handling phone numbers in a MySQL database.
However, the choice of the most appropriate data type, based on memory efficiency and speed, is dependent on the intended database application.
So this will be the dummy question of the year but I need to ask since is not the first time I pass through this. Take a look to the following table definition:
Take a look at the column from_number
which is a VARCHAR(45)
right now but it will hold a phone number. Since I don’t know how many numbers a phone could have all over the world then I am trying to cover almost all of them. I want to keep database integrity as much as possible so I think VARCHAR
is not a proper type for hold this kind of information — maybe I am wrong, you tell me — so I am thinking in change to INT
or even BIGINT
.
When I am defining a column in Workbench I should specify the number between parentheses ()
not in all the cases but in those I mention previous I had to. So if I do this: BIGINT()
I got this error:
Which guide me to read a bit about this MySQL type here. Basically the info is this:
A large integer. … The unsigned range is 0 to 18446744073709551615.
Which make me ask: what value I should set for parentheses when I am defining a BIGINT()
type. (I am using BIGINT because I don’t know if INT can hold as many numbers as a phone could have — perhaps I am wrong too). Which is the right way to create|design a column in MariaDB/MySQL databases?
Anyway I would like to know your opinion, experience and of course I would like to get an answer
Note: I am using MySQL Workbench latest edition for create the ER diagram. I am using also MariaDB 10.0.x
asked Dec 24, 2015 at 18:58
ReynierPMReynierPM
1,69010 gold badges29 silver badges45 bronze badges
1
How would you handle a phone number with an extension, such as «+1-000-000-0000 ext 1234» ?
Note, the «+» indicates international dialing rules should be applied; so from North America, the system automatically knows «011» in front of international calls, etc.
Also, what about phone numbers such as «1-800-DBA-HELP»?
I would typically store phone numbers as text. Having said that, it really depends how critical your phone number column is. If you are running automated dialers from that column, then you’d really want to ensure that only numbers are included, and the data represents well-formed phone numbers.
You could have separate columns for extensions, and phone numbers that have text, such as the «1-800-DBA-HELP» example I provided.
answered Dec 24, 2015 at 19:19
Hannah Vernon♦Hannah Vernon
68.4k22 gold badges164 silver badges303 bronze badges
7
Previously it was written:
«With MariaDB you could use a computed
field to extract just the digits for an auto-dialer. Also works for MySQL 5.7.»
In response to the OP’s question about this («can you explain a bit what are you telling me?»), here is an explanation.
Many database systems have now introduced this feature. These are fields which are known variously as «computed
«, «virtual
» or «generated
» which are derived from values in other fields. The power of this feature will vary depending on your RDBMS. I know that Oracle, Firebird, MariaDB and now MySQL 5.7 have them. Others probably also do.
An easy example would be to have a surname column and have a computed column which «stores» (remember, they can be virtual — i.e. calculated on the fly, or they can be physically stored on disk) the surname as all capitals, thereby making searching easier. That way you only have to search on CAP
s (using, say, LIKE
), knowing that the data being searched in the [computed
| virtual
| generated
] field is in capitalised text.
The concept for MySQL 5.7 is explained here and here. It has been in MariaDB for a bit longer and the concept is also explained here. Some possible uses are suggested here, but you are really only limited by your imagination. They can be seen as a convenient (and less error-prone) substitute for triggers.
For your particular use case, you could derive a dialable number from a text field «+» —> «00» (or whatever your international dialling code is). Just a thought.
answered Dec 26, 2015 at 21:00
VéraceVérace
28.5k8 gold badges64 silver badges80 bronze badges
1
Hmm. Phone numbers are made of numbers. Using varchar allows user to store any type of formatting, with ( or not, with — or . and it quickly creates a mess with your data. A phone # format is «country» dependent, the mask should be tied to the country. Extension is an extension and is optional, so it should be stored in a «extension field». (int also).
For 1-800-DBA-HELP, i would convert that on the fly and store actual number. If you really need these human readable phone #, store it in separate varchar field.
answered May 1, 2017 at 20:24
I usually stores the Phone Numbers in simple text. Formatting and display leave it to the client code.
Here, more than, how you store? what you are going to do with that phone number is really important.
If your business wants to perform outbound calls from your system, application will extract only numbers. If your business wants to make international calls, store country code and area code in separate columns.
If your business wants for reporting, the application will format and display with extension and numbers separately.
From my understanding, designing universal data model for phone number is not a good idea. Each country has different numbers, extensions and area code apart from country code. Also, I came to know, some countries does not have area code.
This may not answer your question but it will help to widen our understanding. Thank you.
answered May 3, 2017 at 11:05
Rathish Kumar BRathish Kumar B
2,1345 gold badges20 silver badges34 bronze badges
тип данных mysql для номера телефона и адреса
Если tel_number больше 15 бит, какой тип данных я могу использовать, мне лучше использовать Bigint(20) ?
например, если у меня есть код страны для Канады я могу использовать +2 или 002. Что лучше для обработки?
Спасибо за совет.
10 ответов
ну, лично я не использую числовой тип данных для хранения телефонных номеров и другая информация.
Как вы храните номер, скажем, 001234567? Это закончится как 1234567, потеряв ведущие нули.
конечно, вы всегда можете оставить его, но это при условии, что вы точно знаете, сколько цифр должно быть.
Это не ответ на весь ваш пост,
Просто мои 2 цента
на самом деле вы можете использовать varchar для телефонного номера. Вам не нужен int, потому что вы не собираетесь выполнять арифметику на числах.
храните их как два поля для телефонных номеров — » номер «и» маска » как TinyText типы которые не нуждаются в более чем 255 пунктов.
прежде чем хранить файлы, мы анализируем номер телефона, чтобы получить форматирование, которое было использовано, и которое создает маску, мы затем храним число только цифры, например
вход: (0123) 456 7890
Номер: 01234567890
Маска: (nnnn)_nnn_nnnn
теоретически это позволяет нам выполнять поиск по числовое поле, такое как получение всех телефонных номеров, которые начинаются с определенного кода области, без необходимости беспокоиться о том, как это было введено пользователями
Я обычно храню телефонные номера как BIGINT в формате E164.
E164 никогда не начинается с 0, причем первые несколько цифр являются кодом страны.
etc. будет храниться как 441234567890 .
Я бы использовал varchar для телефонных номеров. таким образом, вы также можете хранить + и (), что иногда видно в номерах tel (как вы сами упомянули). и вам не придется беспокоиться об использовании всех битов в целых числах.
Я не уверен, что это хорошая идея использовать целые числа вообще. Некоторые числа могут содержать специальные символы (например, # как часть расширения), которые вы также можете обрабатывать. Поэтому я бы предложил использовать varchars.
если хранение менее 1 млн записей, а высокая производительность не является проблемой для varchar (20) / char(20) в противном случае я обнаружил, что для хранения даже 100 миллионов глобальных бизнес-телефонов или личных телефонов int лучше всего. Причина: меньший ключ — > более высокая скорость чтения / записи, также форматирование может допускать дубликаты.
1 телефон в char (20) = 20 байт против 8 байт bigint (или 10 против 4 байт int для местных телефонов, до 9 цифр), меньше записей может ввести блок индекса => больше блоков = > дополнительные поиски, см. этой для получения дополнительной информации (writen для Mysql, но это должно быть верно для других реляционных баз данных).
вот пример телефонных таблиц:
или с обработкой/разделение перед вставкой (2+2+4+1 = 9 байт)
также «номер телефона не является номером», на мой взгляд, относительно типа телефонных номеров. Если мы говорим о внутренней мобильной телефонной книге, то строки в порядке, как пользователь может пожелать магазин GSM хэш-коды. Если хранить E164 телефоны, bigint-лучший вариант.
посмотреть рекомендация Twilio для получения дополнительной информации о локализации телефоны.
INT (10) не означает 10-значное число, это означает целое число с шириной отображения 10 цифр. Максимальное значение для INT в MySQL-2147483647 (или 4294967295, если без знака).
вы можете использовать BIGINT вместо INT для хранения его как числового. С помощью BIGINT сохранит вам 3 байта в строке над VARCHAR (10).
хранить «страна + область + номер отдельно». Вы можете попробовать использовать VARCHAR (20), это позволяет вам хранить международные номера телефонов, если возникнет необходимость.
varchar или текст должны быть лучшими типами данных для хранения мобильных номеров, я думаю.
SQL Мобильный телефон — char или int?
В каком типе поля SQL лучше хранить мобильный телефон — char или int?
в начале было слово «+»
Chukcha, а зачем хранить +? Например, я захочу получить номера определенного оператора, LIKE для CHAR будет настолько же производителен, как и диапазон для INT?
Ок. Храните в двух полях — форматированное по вашему желанию
и чистое от формата 🙂
Если хотите использовать для поиска — char без формата номера, для быстрого доступа — отформатировнный
А еще. отдельным полем код оператора
лучше всего в varchar
будет смотреться гармоничнее, нежели
да и пользоваться тоже удобнее
Храните номера в соответствии со стандартом E.164. Символы, отличные от цифр, не нужны.
Хранить в varchar. Сами так храним.
Попробуйте для теста записать 9999999999 в поле int
unsigned int имеется в виду.
Я бы масштабируемость сразу бы заложил.
3 поля: регион, код сети, номер телефона.
Допустим расширяемость, отчеты, да многое можно будет оптимизировать потом.
И выводить проще, если в отдельных полях будет )
Друзья, объясните, когда можно использовать один KEY для двух значений? Вот у меня есть номер телефона, который разбит на FOREIGN KEY `country` и непосредственно сам номер телефона. Я не вижу смысл создавать отдельные ключи для страны и номера, могу ли я сделать один ключ? Или для выборки это не катит? Нужно будет выбирать конкретный номер телефона, то-есть, выборка за `phone`, но использовать форматирование вывода в зависимости от `country`.
Если я хочу, чтобы целый номер country + phone был уникальным, по аналогии, нужно создавать один ключ UNIQUE?
Какой тип данных лучше всего подходит для телефонного номера в MySQL и каким должно быть сопоставление типов Java для него?
Я использую MySQL с шаблоном Spring JDBC для своего веб-приложения. Мне нужно сохранить номер телефона только цифрами (10). Я немного смущен типом данных с использованием типа данных.
- Какой тип данных для него предпочтительнее в MySQL?
- Каким должен быть тип данных Java в классах Bean (POJO) для этого?
- Как я могу проверить этот тип данных с помощью проверок / ограничений javax для длины, а также разрешенной только цифры?
Строки и VARCHAR.
Не пытайтесь сохранять телефонные номера как настоящие. это испортит форматирование, удалит предыдущие 0 и другие нежелательные вещи.
Вы можете, если захотите, ограничить ввод данных пользователем только числовыми значениями, но даже в этом случае сохраняйте резервные данные в виде символов / строк, а не чисел.
Прежде чем пытаться вводить какие-либо ограничения длины, проверки или маски (например, XXX-XXXX-XX), узнайте о мире в целом и о том, как различаются их длина и форматирование номеров.
В телефонных номерах могут использоваться нечисловые символы. Яркий пример + — замена 00 в начале международного номера.