web-dev-qa-db-ja.com

E.164への電話番号の保存

TLDR;MySQL(または同等の制約を持つ任意のDB)に電話番号を格納する場合、正しい形式はE.164値からVARCHAR( 32)フィールド?

国際電話番号のフォーマット/保存について読んでいます。これまで、さまざまな理由により、このデータは実際の番号ではなく識別子であるため、文字列として格納することが推奨されていました(先頭に0が付くなどの問題がある)。私は正規表現を介して電話番号を解析/検証しないでください。これを処理してE.164形式の値を生成するには、通常、Googleが開発したlibphonenumberをお勧めします。

E.164が今日の電話番号に最適なストレージ形式であると言っても安全だと思います。先頭の+は必要ないと思われ、先頭の0はこの形式では発生しませんか?これをMySQLデータベースに保存するために提案されたBIGINT(15)を見てきました。これには、内線番号を持つ電話番号をサポートするための追加のフィールド(string?)が必要です。ウィキペディアの記事には記載されていませんが、E.164形式が「; ext = 12345」を追加することで拡張機能をサポートするというブログ記事で多くの言及を見てきました。VARCHAR(32)フィールドに格納する方が賢明でしょうか? "+19995556789; ext = 12345"、32はこの形式の最大長であるべきなので、32の長さが適切ですか? <+> <; ext =>

編集: this によると、拡張機能の値が正確に何であるかはわかりませんが、リンク先の article は、Appleによって変更され、アーカイブされています。延長の長さに関する明確な情報はありません。 VARCHAR(50)などのより高い制限に最適なのでしょうか、それともBIGINT(15)と、NULL可能である拡張機能の追加フィールドを併用するのが最善でしょうか。

5
Brennan

BIGINT(15)またはBIGINT(18)も、考えられるすべての電話番号を格納するのに十分な長さではない場合があります。 PBXが関係するかどうかによって異なりますが、18桁では十分ではありません。長い数字はすでにかなり多く見られています。それでも、E.164では、電話番号を世界中の電話プロバイダーへの15桁以上、すべてがこれらの規格に準拠しているわけではありません。

データベースの正確な位置はわかりませんが、電話番号を保存する場合は、文字ベースの形式を使用することを強くお勧めします。電話番号を実際に使用するほとんどのアプリケーションでは、電話番号を保存するだけでなく使用することもできます。電話番号を使用する場合、プレフィックスを追加、変更、または置き換えるためにいくつかの変換が必要になる場合があります。または、国際電話番号はすべて同じ長さではないため、データベースでは文字ベースを使用する方がはるかに簡単で高速です。 CHAR(32)またはVARCHAR(32)のような形式。文字ベースのフィルター操作(数値パターン、プレフィックス、エリアコードなど)の速度が重要な場合、CHAR typは通常VARCHARよりも優れていますが、末尾のスペースをクリーンアップする必要があります。国際的には、ダイヤルインでダイレクトを実現する2つの一般的な方法があります。私はそれらを「直通ダイヤル」と「ポスト接続ダイヤル」と呼びます。キャリアが割り当てた番号で連続してダイヤルできるため、任意の直接ダイヤル番号を「通常の」番号フィールドに入力できます。他のタイプは、通常、内線番号をダイヤルし続ける前に一時停止が必要です(ほとんどの小規模な米国のレガシーPBXシステム)のように)これらの「ポストダイヤル番号」は別のフィールドに入力する必要があります。私はあなたが言及したE.164拡張フォーマットを使用しないでしょう、それは私が10年以上ずっと業界で働いているので、私が生産でそれを見たことがないので、めったに使用されません。

1
fgwaller