電話番号と住所のmysqlデータ型
-
12-09-2019 - |
質問
国番号、内線番号を含む電話番号をフォームに入力したい
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 を使用できます。加工するにはどちらが良いでしょうか?
アドバイスありがとうございます。
解決
まあ、個人的に私は電話番号や関連情報を保存するために、数値データ型を使用しないでください。
どのように番号が001234567と言う保存しますか?これは、先行ゼロを失って、1234567となってしまいます。
もちろん、あなたはいつもそれをアップパッドは左することができますが、それはあなたが数あるべき正確にどのように多くの桁数を知っています。
このは
、あなたの全体のポストに答えていません。
ちょうど私の2セント。
他のヒント
実際にあなたが電話番号のためのvarchar型を使用することができます。あなたは数字に算術演算を実行するつもりはないので、あなたはint型を必要としません。
電話番号用の2つのフィールドとして保管してください - 。「数」と255個の以上のアイテムを必要としない「マスク」TinyText
タイプはのようにの
、我々はその後、数字だけ例えば番号を保存します。
入力:(0123) 456 7890
番号:01234567890
マスク:(nnnn)_nnn_nnnn
理論的にはこれは、私たちは、それがユーザーによって入力されたかを気にすることなく、そのような特定の市外局番で始まるすべての電話番号の取得などの番号フィールド上の比較検索を実行することができます。
私は通常店の電話番号。
E164は、最初の数桁が国コードであることと、0で始まることはありません。
+441234567890
+44 (0)1234 567890
01234 567890
など。 441234567890
として格納されます。
私は、電話番号のvarchar型を使用します。 (自分で述べたように)その方法は、あなたはまた、時々、TEL番号に見られる、+保存し()することができます。そしてあなたは、整数のすべてのビットを使用して心配する必要はありません。
私はそれがすべてで整数を使用することをお勧めしますかわかりません。いくつかの数字は、特殊文字が含まれる場合があります(#例えば延長の一部として)あなたも扱うことができるはずです。だから私は、代わりのvarcharを使用することをお勧めします。
そう、私も100 milionグローバルビジネスフォンや個人の携帯電話を格納するため、int型が最良であることがわかってきた未満1つのミルのレコードを格納し、かつ高いパフォーマンスはVARCHAR(20)/ CHAR(20)のために行くの問題ではない場合。理由:小さいキー - >高い読み取り/書き込み速度、また、重複を可能にすることができます書式設定
チャー1つの電話(20)= 20のバイト対8バイトbigint
(またはローカル電話の10 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は最適なオプションです。
正規化を検討してください E.164 フォーマット。完全な国際サポートを得るには、15 桁の VARCHAR が必要です。
見る Twilio の推奨事項 電話番号のローカライゼーションの詳細については、こちらをご覧ください。
INT(10)は、10桁の数字を意味するものではない、それは、10桁の表示幅の整数を意味します。 MySQLでINTの最大値は2147483647(または4294967295符号なしの場合)である。
あなたは、数値として保存する代わりに、INTのBIGINTを使用することができます。使い方 BIGINTはあなたにVARCHAR(10)を介して、行ごとに3つのバイトを保存します。
「別に国+地域+番号」を格納すること。あなたはその必要が生じた場合、これはあなたに適切に国際電話番号を格納する機能を可能にする、VARCHAR(20)を使用して試すことができます。
varchar型またはテキストは、私が推測する携帯電話番号を格納するための最良のデータ型である必要があります。