web-dev-qa-db-ja.com

MySQLの電話番号に最適なデータ型はどれですか?また、Java型マッピングはどのようにすべきですか?

私はMySQLをSpring JDBCテンプレートとともにWebアプリケーションに使用しています。電話番号を数字のみで保存する必要があります(10)。データ型を使用したデータ型について少し混乱しています。

  1. MySQLで推奨されるデータ型は何ですか?
  2. そのためのBean(POJO)クラスのJavaデータ型は何ですか?
  3. Javax.validations/constraintsでそのデータ型を検証するにはどうすればよいですか?また、数字のみが許可されますか?
45

文字列とVARCHAR。

  • 電話番号を実際の番号として保存しないでください。フォーマットを台無しにし、前の0sやその他の望ましくないものを削除します。

  • 必要に応じて、ユーザー入力を数値のみに制限することもできますが、その場合でも、数値ではなく文字/文字列としてバッキング永続化データを保持します。

  • あらゆる種類の長さ制限、検証、またはマスク(XXX-XXXX-XXなど)を実装しようとする前に、より広い世界とそれらの数の長さとフォーマットの違いに注意してください。

  • 電話番号には数字以外の文字を使用できます。代表的な例は、国際番号の先頭にある+の代わりとしての00です。

コメントの会話から編集しました:

  • 電話番号が数値と関係があるというのは、UIの大きな間違いの1つです。それらをアドレスのように考えて扱う方がはるかに優れています。電話の「番号」よりも実際に存在し、表現するものに近いです。
54
indivisible

MySQLでは、> INT(10)は10桁の数字を意味するのではなく、表示幅が10桁の整数を意味します。 MySQLのINTの最大値は2147483647(または、符号なしの場合は4294967295)です。

INTの代わりにBIGINTを使用して、数値として格納できます。 BIGINTを使用すると、VARCHAR(10)で行ごとに3バイト節約できます。

「国+地域+番号を個別に」保存する場合。 VARCHAR(20)を使用してみてください。これにより、必要に応じて国際電話番号を適切に保存できます。

12
Irshad Khan

E.164 形式の使用を検討してください。完全に国際的なサポートを得るには、15桁のVARCHARが必要です。

電話番号のローカライズの詳細については、 Twilioの推奨事項 を参照してください。

5
00500005
  1. varchar
  2. ひも

  3. 単純な正規表現。参照: Javaで文字列に数字のみが含まれているかどうかを確認する方法 。 javax.constraints.Patternを使用します。

2
GreyBeardedGeek

var-char、String、およびintを使用できます。携帯電話番号で国番号のみを使用する場合はintを使用できます。 var-charを使用して、numberのサイズを変更し、ユーザーから制限する必要があります。

1
damon

おそらく15〜20の長さのVARCHARで十分であり、データベースに最適なオプションです。あなたはおそらくあなたの電話番号とともに様々なハイフンとプラス記号を必要とするでしょうから。

0
NcDreamy

Mysqlの場合:BIGINT。 Javaの場合:長い。

それはすべてあなたの要件に基づいています。小規模アプリを開発していて、特定の地域(対象ユーザー)のみを対象としている場合、VARCHARはBIGINTよりも多くのバイトを消費するため、数字のみを保存するBIGINTを選択できます(最適なメモリ使用量の設計が重要です)。ただし、大規模なアプリを開発しており、グローバルユーザーを対象としており、データを保存するのに十分なデータベース機能がある場合は、間違いなくVARCHARを選択できます。

0
bala raja