web-dev-qa-db-ja.com

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

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

enter image description here

VARCHAR(45)である列_from_number_を見てください。ただし、電話番号は保持されます。電話が世界中でいくつの番号を持つことができるかわからないので、私はそれらのほとんどすべてをカバーしようとしています。データベースの整合性をできる限り維持したいので、VARCHARはこの種の情報を保持するための適切なタイプではないと思います-おそらく私は間違っていると私に言ったので、INTまたはBIGINT

Workbenchで列を定義するとき、括弧内の数を指定する必要があります_()_すべての場合ではありませんが、前に述べた場合、私はしなければなりませんでした。だから私がこれをすると:BIGINT()私はこのエラーを受け取りました:

enter image description here

このMySQLの型について少し読むガイド ここ 。基本的に情報はこれです:

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

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

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

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

12
ReynierPM

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

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

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

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

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

13
Max Vernon

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

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

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

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

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

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

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

2
Vérace

私は通常、電話番号をsimple textに格納します。書式設定と表示は、クライアントコードに任せます。

ここでは、それ以上に、どのように保存しますか? その電話番号をどうするかは非常に重要です。

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

あなたのビジネスがreportingを必要とする場合、アプリケーションはフォーマットし、拡張子と数字を別々に表示します。

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

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

1
Rathish

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

1
greenlitmysql