国番号、内線番号などの形式で電話番号を入力したい
_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つのフィールドとして保存します-TinyText
型としての「番号」と「マスク」255を超えるアイテムは必要ありません。
ファイルを保存する前に、電話番号を解析して、使用され、マスクを作成するフォーマットを取得します。次に、数字を1桁のみ保存します。
入力:(0123) 456 7890
番号:01234567890
マスク: (nnnn)_nnn_nnnn
理論的には、これにより、ユーザーがどのように入力したかを心配することなく、特定の市外局番で始まるすべての電話番号を取得するなど、Numberフィールドで比較検索を実行できます。
私は通常、電話番号をE164形式のBIGINTとして保存します。
E164が0で始まることはありません。最初の数桁は国コードです。
+441234567890
+44 (0)1234 567890
01234 567890
などは441234567890
として保存されます。
電話番号にはvarcharを使用します。そのようにして、+と()を格納することもできます。これは、電話番号に表示されることがあります(自分で言ったように)。整数のすべてのビットを使い果たすことを心配する必要はありません。
整数を使用するのが良い考えかどうかはわかりません。一部の数値には、特殊文字(たとえば、拡張子の一部としての#)が含まれている場合がありますが、これも処理する必要があります。したがって、代わりにvarcharを使用することをお勧めします。
1 mil未満のレコードを保存し、高いパフォーマンスがvarchar(20)/ char(20)の問題でない場合は、100ミリオンのグローバルなビジネス用電話または個人用電話でも、intが最適であることがわかりました。理由:キーが小さい->読み取り/書き込み速度が速い、またフォーマットにより複製が可能です。
char(20)の1つの電話= 20バイトvs 8バイトbigint
(またはローカル電話の場合10 vs 4バイトint
、最大9桁)、より少ないエントリがインデックスブロックに入ることができます=>より多くのブロック=>より多くの検索。詳細については this を参照してください(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またはtextは、携帯電話番号を保存するのに最適なデータ型である必要があります。