50

国番号、内線番号を含む電話番号をフォームに入力したい

create table if not exists employee(    `   
      country_code_tel   int(11),
      tel_number         int(10),
      extension          int(10),
      mobile             bigint(20)
);

tel_number が 15 ビットより大きい場合、どのデータ型を使用できますBigint(20)か?

create table address(
      address           varchar(255),  
      city              varchar(255),
      country           varchar(255),
      post_code         int(11)
);

たとえば、カナダの国コードがある場合、+2 または 002 を使用できます。どちらが処理に適していますか?

アドバイスありがとうございます。

4

11 に答える 11

72

個人的には、数値データ型を使用して電話番号や関連情報を保存することはありません。

001234567 という数字をどのように保存しますか? 最終的には 1234567 になり、先頭のゼロが失われます。

もちろん、いつでも左側にパッドを入れることができますが、それは数値が何桁になるべきかを正確に知っている場合に限られます。

これはあなたの投稿全体に答えているわけではありません。
私の 2 セントだけです

于 2009-12-04T11:06:25.743 に答える
51

実際、電話番号には varchar を使用できます。数値に対して算術演算を実行しないため、int は必要ありません。

于 2009-12-04T11:05:31.750 に答える
31

それらを電話番号用の 2 つのフィールドとして保存します。255 個以上の項目を必要としないTinyTextタイプとして、「番号」と「マスク」です。

ファイルを保存する前に、電話番号を解析して、使用されたフォーマットを取得し、マスクを作成します。次に、数字のみを保存します。

入力: (0123) 456 7890
数値:01234567890
マスク: (nnnn)_nnn_nnnn

理論的には、これにより、ユーザーがどのように入力したかを気にすることなく、特定の市外局番で始まるすべての電話番号を取得するなど、番号フィールドで比較検索を実行できます。

于 2009-12-04T11:44:21.653 に答える
24

私は通常、電話番号を E164 形式の BIGINT として保存します。

E164 は 0 で始まることはなく、最初の数桁が国コードです。

+441234567890
+44 (0)1234 567890
01234 567890

などとして保存され441234567890ます。

于 2010-09-12T15:57:39.363 に答える
7

電話番号には varchar を使用します。そうすれば、電話番号で時々見られる + と () も格納できます (あなたが言及したように)。整数のすべてのビットを使い果たすことを心配する必要はありません。

于 2009-12-04T11:06:15.163 に答える
5

整数を使用するのが良い考えかどうかはわかりません。一部の数字には、特殊文字 (拡張子の一部として # など) が含まれている場合がありますが、これも処理できるはずです。したがって、代わりに varchars を使用することをお勧めします。

于 2009-12-04T11:06:15.307 に答える
3

保存するレコードが100万未満で、高性能が問題にならない場合は、varchar(20)/ char(20)を選択してください。そうでない場合は、1億台のグローバルなビジネス用電話や個人用電話を保存する場合でも、intが最適であることがわかりました。理由:キーが小さい->読み取り/書き込み速度が速い、フォーマットも重複を許可する可能性があります。

char(20)の1つの電話= 20バイトvs8バイトbigint(またはローカル電話の場合は10 vs 4バイトint、最大9桁)、インデックスブロックに入力できるエントリが少ない=>ブロックが多い=>検索が多い、詳細についてはこちらをご覧ください(Mysql用に作成されていますが、他のリレーショナルデータベースにも当てはまるはずです)。

電話テーブルの例を次に示します。

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

または挿入前の処理/分割あり(2 + 2 + 4 + 1 = 9バイト)

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
;

また、「電話番号は番号ではありません」、私の意見では、電話番号の種類に関連しています。内部の携帯電話帳について話している場合、ユーザーはGSMハッシュコードを保存したいので、文字列は問題ありません。E164電話を保管する場合は、bigintが最適なオプションです。

于 2013-02-24T14:28:22.913 に答える
3

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

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

「国+地域+番号」を分けて保存する。VARCHAR(20) の使用を試すことができます。これにより、必要に応じて国際電話番号を適切に保存することができます。

于 2016-03-09T11:06:37.723 に答える
3

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

電話番号のローカリゼーションの詳細については、 Twilio の推奨事項を参照してください。

于 2016-02-06T02:09:16.823 に答える
1

varchar または text は、私が推測する携帯電話番号を格納するための最良のデータ型である必要があります。

于 2015-08-04T05:37:03.177 に答える