電話番号のデータ型:VARCHAR、INTまたはBIGINT?


12

ですから、これは今年のダミーの質問になりますが、これを通過するのは初めてではないので、尋ねる必要があります。次のテーブル定義を見てください。

ここに画像の説明を入力してください

今すぐですが、電話番号が表示される列from_numberを見てくださいVARCHAR(45)。電話が世界中でいくつの番号を持つことができるかわからないので、私はそれらのほとんどすべてをカバーしようとしています。私は私が考えるように、可能な限り、データベースの整合性を維持したいVARCHARあなたは私に言う、多分私は間違っている- -私はへの変更に考えていますので、この種の情報ホールドのための適切なタイプではありませんINT偶数かBIGINT

Workbenchで列を定義するとき()は、すべての場合ではなく、前に言及したものの中で括弧で囲まれた数を指定する必要があります。だから私がこれを行うと:BIGINT()私はこのエラーを受け取りました:

ここに画像の説明を入力してください

ここで、このMySQLタイプについて少し読んでください。基本的に情報はこれです:

大きな整数。...符号なしの範囲は0〜18446744073709551615です。

それは私に尋ねます:BIGINT()型を定義するときに括弧に設定する値。(私はBIGINTを使用していますが、これはINTが電話が持つことができる数と同じ数を保持できるかどうかわからないためです-おそらく私も間違っています)。MariaDB / MySQLデータベースに列を作成する正しい方法はどれですか?

とにかく私はあなたの意見、経験を知りたいです、そして、もちろん、私は答えを得たいです

注: ER図の作成には、MySQL Workbench最新版を使用しています。MariaDB 10.0.xも使用しています


回答:


13

「+ 1-000-000-0000 ext 1234」などの内線番号を含む電話番号をどのように処理しますか?

「+」は、国際ダイヤルルールを適用する必要があることを示します。そのため、北米からは、システムは国際電話などの前に「011」を自動的に認識します。

また、「1-800-DBA-HELP」などの電話番号についてはどうですか?

通常、電話番号はテキストとして保存します。そうは言っても、それはあなたの電話番号の列がどれほど重要であるかによります。その列から自動ダイヤラーを実行している場合は、数字のみが含まれ、データは整形式の電話番号を表していることを確認する必要があります。

私が提供した「1-800-DBA-HELP」の例のように、内線番号とテキストのある電話番号用に別々の列を作成できます。


はい、それらは重要であるため、数字のみを許可することに基づいて、将来的に間違いを犯すことはありませんが、あなたの提案は何ですか?内線番号を保持するか、私は人々のように数字を入力したい新しい列を追加するのは簡単です1-800-DBA-HELP、それの桁
ReynierPM

それは本当にあなたの要件に依存します。人間が認識できるようにする必要がある場合は、おそらくテキストベースの数値をテキストフィールドのどこかに保管する必要があります。テキスト部分を気にしない場合は、保存しないでください。
マックスヴァーノン

1
国番号で完全な番号を保存する場合、INTは確かに十分な大きさではありません。BIGINTはおそらく十分な大きさです。
マックスヴァーノン

1
少なくとも20桁必要です。
マックスヴァーノン

1
MariaDBでは、計算フィールドを使用して、自動ダイヤラーの数字のみを抽出できます。たぶん、MySQL 5.7(不明)。
ヴェレース

2

以前は書かれていました:

「MariaDBを使用すると、computedフィールドを使用して自動ダイヤラーの数字だけを抽出できます。MySQL5.7でも機能します。」

これに関するOPの質問(「あなたは私に言っていることを少し説明してもらえますか?」)に応えて、ここに説明があります。

現在、多くのデータベースシステムでこの機能が導入されています。これらは、「computed」、「virtual」、または「generated」としてさまざまに知られているフィールドであり、他のフィールドの値から派生しています。この機能の能力は、RDBMSによって異なります。Oracle、Firebird、MariaDB、そして今ではMySQL 5.7がそれらを持っていることを知っています。他の人もおそらくそうします。

簡単な例は、姓の列を持ち、すべての大文字として姓を「保存」する計算列を使用することです(仮想、つまりオンザフライで計算、または物理的にディスクに保存できます)。簡単に検索できます。そうすればCAP、(を使用してLIKE)で検索するだけで、[ computed| virtual| generated]フィールドは大文字のテキストです。

MySQL 5.7の概念については、ここここで説明します。MariaDBにはもう少し前からあり、その概念についてもここで説明しますここではいくつかの可能な用途を提案しますが、実際にはあなたの想像力によってのみ制限されます。これらは、トリガーの便利な(エラーが発生しにくい)代替品と見なすことができます。

特定のユースケースでは、テキストフィールド「+」->「00」(または国際ダイヤルコード)からダイヤル可能な番号を取得できます。ちょっとした考え。


質問を追加して質問を少し改善できますか?私はコンセプトを得たが、私が作成する方法を確認していない意味virtualgenerated価値を。私は使用中CONCATまたは他の何かを考えていますが、まったくわかりません。また、あなたはこれCAPSを使用して検索について言及しLIKEますが、これの例を置くこともできますか?オンザフライで計算された(virtual) vs persisted (生成された)列のパフォーマンスはどうですか?
ReynierPM

1

うーん。電話番号は数字で構成されています。varcharを使用すると、ユーザーは(またはそうでない、-または。を使用して任意のタイプのフォーマットを保存できます。データをすぐに混乱させます。電話番号のフォーマットは「国」に依存するため、マスクは国に関連付けられます。は拡張機能であり、オプションであるため、「拡張フィールド」に格納する必要があります(int)。1-800-DBA-HELPの場合、その場で変換し、実際の番号を格納します。人間が読める電話番号、別のvarcharフィールドに保存します。


1

私は通常単純なテキストで電話番号を保存します。フォーマットと表示は、クライアントコードに任せます。

ここでは、どのように保存するのですか?その電話番号で何をするかは本当に重要です。

あなたのビジネスがあなたのシステムからアウトバウンドコールを実行したい場合、アプリケーションは数字のみを抽出します。ビジネスで国際電話をかける場合、国コードと市外局番を別々の列に保存してください。

ビジネスでレポートが必要な場合、アプリケーションは内線番号と番号を個別にフォーマットして表示します。

私の理解では、電話番号のユニバーサルデータモデルを設計することはお勧めできません。国コードとは別に、国ごとに異なる番号、内線番号、市外局番があります。また、一部の国には市外局番がありません。

これはあなたの質問に答えないかもしれませんが、それは私たちの理解を広げるのに役立ちます。ありがとうございました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.