Какой тип данных лучше всего подходит для номера телефона в MySQL и каким должно быть сопоставление типов Java для него?

Я использую MySQL с шаблоном Spring JDBC для своего веб-приложения. Мне нужно сохранить номер телефона только с цифрами (10). Я немного запутался в типе данных, используя тип данных.

  1. Какой тип данных предпочтительнее для него в MySQL?
  2. Каким должен быть тип данных Java в классах Bean (POJO) для этого?
  3. Как я могу проверить этот тип данных с помощью проверок/ограничений javax для длины, а также разрешены только цифры?

person Vishal Zanzrukia    schedule 22.06.2014    source источник


Ответы (10)


Строки и VARCHAR.

  • Не пытайтесь хранить телефонные номера как настоящие. это испортит форматирование, удалит предшествующие 0 и другие нежелательные вещи.

  • Вы можете, если хотите, ограничить пользовательский ввод только числовыми значениями, но даже в этом случае сохраняйте резервные сохраненные данные в виде символов/строк, а не чисел.

  • Прежде чем пытаться реализовать какие-либо ограничения длины, проверки или маски (например, XXX-XXXX-XX), ознакомьтесь с более широким миром и с тем, как различаются длина и форматирование их чисел.

  • Нечисловые символы могут использоваться в телефонных номерах. Ярким примером является + в качестве замены 00 в начале международного номера.

Отредактировано из беседы в комментариях:

  • Это одна из самых больших ошибок пользовательского интерфейса, что телефонные номера имеют какое-либо отношение к числам. Гораздо лучше думать о них и обращаться с ними как с адресами, это ближе к тому, чем они на самом деле являются и представляют, чем телефонные «номера».
person indivisible    schedule 22.06.2014
comment
Вы также можете не ограничивать символы, если это прочитает человек. В разных странах действуют разные условные обозначения, и есть большая вероятность, что при перечтении номера в стране C будет распознано условное обозначение, которое человек в стране C использовал при вводе в него. - person yshavit; 22.06.2014
comment
Лично я бы ограничил его только [0-9], пробелом или дефисом -. пусть пользователь форматирует по своему усмотрению. По крайней мере, на ранних этапах разработки числовое форматирование не занимало бы много места в моем списке возможностей. - person indivisible; 22.06.2014
comment
но предположим, что я хочу только цифры..и моя система будет только для одной страны..тогда? - person Vishal Zanzrukia; 22.06.2014
comment
В вашей стране используются коды городов? Захотят ли люди когда-нибудь наболеть номером из-за границы? Они начинаются с нуля (0), который будет потерян, если вы попытаетесь сохранить число вместо текста. Это одна из самых больших ошибок пользовательского интерфейса, что телефонные номера имеют какое-либо отношение к числам. Гораздо лучше думать о них и обращаться с ними как с адресами, это ближе к тому, что они представляют собой на самом деле. - person indivisible; 22.06.2014
comment
В каком бы поле ввода ваш пользователь ни вводил номер телефона, вы должны иметь возможность отслеживать и ограничивать/отклонять любой введенный символ, который не является числом, пробелом или дефисом. Если вы хотите написать автоматические маски чисел, то это, конечно, ваша прерогатива. - person indivisible; 22.06.2014
comment
@VishalZanzrukia - ты можешь делать все, что хочешь. Этот сайт предлагает советы, и другие пользователи оценивают эти советы. Вы вольны следовать совету или нет. Я бы также добавил, что знак + часто используется для международных номеров. - person CramerTV; 11.03.2015
comment
+1 Я ценю ваш аргумент в пользу использования строки/varchar. Я видел, как другие рекомендуют числовые типы данных, но кажется, что даже расширения или подобные вещи не будут разрешены (и потребуется еще один столбец... Для простоты я просто собираюсь использовать varchar... спасибо за ваш пост. .. - person twknab; 26.09.2018
comment
Согласен, что VARCHAR лучше всего подходит, но не по причинам, упомянутым в этом ответе. Вопрос касается хранения, а не форматирования. Номер телефона должен быть преобразован в E.164 перед сохранением. В этом формате не существует номера телефона, который может начинаться с 0, поэтому, если вы удалите начальный знак + (который вы можете добавить после извлечения из БД), вы можете сохранить его как BIGINT. Единственный минус - тогда сложнее искать по частично введенным номерам телефонов. Но преимущество - занимает меньше байт и быстрее работает MySQL. - person Ruslan Stelmachenko; 15.11.2019
comment
Это одна из самых больших ошибок пользовательского интерфейса. Какое отношение хранение данных в sql имеет к пользовательскому интерфейсу, когда вы можете хранить их как числа (код набора, номер) при форматировании их по своему усмотрению на стороне клиента? зачем хранить ненужные символы + или - или даже начальный 0, когда можно эффективно использовать smallint для dialcode и longint для number, тем самым минимизируя пространство и улучшая производительность выбора? - person Ali Kleit; 15.08.2020

В MySQL -> INT(10) не означает 10-значное число, это означает целое число с шириной отображения 10 цифр. Максимальное значение для INT в MySQL равно 2147483647 (или 4294967295, если оно не подписано).

Вы можете использовать BIGINT вместо INT, чтобы сохранить его как числовое. Использование BIGINT сэкономит вам 3 байта на строку по сравнению с VARCHAR(10).

Если вы хотите хранить «Страна + район + номер отдельно». Попробуйте использовать VARCHAR(20). Это позволяет вам правильно хранить международные телефонные номера, если в этом возникнет необходимость.

person Irshad Khan    schedule 09.03.2016

Рассмотрите возможность использования формата E.164. Для полной международной поддержки вам понадобится VARCHAR из 15 цифр.

Дополнительную информацию о локализация телефонных номеров.

person 00500005    schedule 06.02.2016
comment
В чем разница с E.123? - person nowox; 16.04.2019
comment
@nowox Вы всегда можете поискать в Интернете, чтобы узнать, есть ли ответ в Интернете. - person Jonathan J. Pecany; 05.10.2020

  1. варчар
  2. Нить

  3. Простое регулярное выражение. См.: Как проверить, содержит ли строка только цифры в Java. Используйте javax.constraints.Pattern.

person GreyBeardedGeek    schedule 22.06.2014

VARCHAR длиной, вероятно, 15-20 было бы достаточно, и это был бы лучший вариант для базы данных. Поскольку вам, вероятно, потребуются различные дефисы и знаки плюса вместе с вашими телефонными номерами.

person NcDreamy    schedule 22.06.2014

вы можете использовать var-char, String и int, это зависит от вас, если вы используете только код страны с номером мобильного телефона, чем вы можете использовать int, если вы используете специальный формат для номера, чем используйте тип String или var-char, если вы используйте var-char, затем необходимо испортить размер числа и запретить пользователю.

person damon    schedule 21.02.2015

Это все основано на вашем требовании. если вы разрабатываете небольшое приложение и охватываете только определенный регион (целевую аудиторию), вы можете выбрать BIGINT для хранения только чисел, поскольку VARCHAR потребляет больше байтов, чем BIGINT (имеет значение оптимальное использование памяти). но если вы разрабатываете крупномасштабное приложение и ориентируетесь на глобальных пользователей и у вас достаточно возможностей базы данных для хранения данных, вы определенно можете выбрать VARCHAR.

person bala raja    schedule 29.08.2018

  1. Нить
  2. Варчар

Это мое мнение о моей базе данных, рекомендованное моим наставником.

person duytung112    schedule 13.01.2020

Мое требование - отображать 10-значный номер телефона в jsp. Итак, вот установка для меня.
MySQL: numeric(10)

Сторона Java:

@NumberFormat(pattern = "#")  
private long mobileNumber;

и это сработало!

person mannedear    schedule 15.08.2018

В mysql: БОЛЬШОЙ. В Java: Длинный.

person Александр Аверьянов    schedule 13.10.2017