保存するレコードが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が最適なオプションです。