2011-07-29 5 views
3

レコードの数が非常に多いので、私はインドの携帯電話番号をMySQLテーブルに保存したいと考えています。私は自分のストレージを最適化したいと思っています。 インドの携帯電話番号は10桁で、通常は7,8,9から始まります。 たとえば9XXXXXXXXXmysqlに4バイトまたは8バイトの代わりに整数を格納するためにNバイトを割り当てる方法は?

関連するMySQLのフィールドは次のとおり

見られるよう
Type Storage  Minimum Value   Maximum Value 
      (Bytes)  (Signed/Unsigned)  (Signed/Unsigned) 

INT  4   -2147483648    2147483647 
          0     4294967295 <-- somewhat small 

BIGINT 8  -9223372036854775808  9223372036854775807 
         0    18446744073709551615 <-- too large 

、符号なしINTは、(値の約半分)少し小さく、符号なしのBIGINTは10桁の番号を格納することは非常に大きいです。 このデータを格納するには5バイトで十分です。

私の質問は以下のとおりです。 -

A)バイトのカスタム番号を割り当て、利用可能なデータ型のいずれかのタイプにMYSQLにこのデータを格納するための良い方法はありますか?

b)これは早すぎる最適化ですか?これに何か利点/欠点がありますか?

c)4バイトと8バイトのような自然なサイズのデータ​​型を持ち、データベースの5バイトと6バイトのような中間サイズを無視すると、どのような利点がありますか?

注:10桁の数字は電話番号ではなく、10桁の整数とします。 VARCHARは私が探しているものではありません。

答えて

3

@diEchoには、電話番号にVARCHAR()を使用する必要があることに同意します。私の生涯では、私は6桁、7桁、9桁の数字を持っています(私はしばしば別の郡にあり、国番号と私の数字に13桁の数字を付ける必要があります)。

算術演算を行わないか、実際には "20> 9"のような比較が必要な場合を除き、このデータを文字のままにしておいてください。

INTまたはBIGINTに適合しない固定桁数が必要で、数値比較が必要な同様の問題が発生した場合は、DECIMAL(10進数指定子なし)をDECIMAL )。

+0

ありがとうございます。それは役に立ちます。 – DhruvPathak

0

は、多くの作り付けの機能がある

... INT OR BIGINT..use VARCHAR(10)を使用してはいけないし、データベースに挿入する前に、データをサニタイズMYSQLとPHP(私はあなたがPHPを使用していると仮定)

です

、あなたはその後

BIGINT UNSIGNED 
+0

varcharは10 + 1 = 11バイトのサイズではありませんか?私は可能な整数解を探していました。 – DhruvPathak

2

電話nymberを使用選択するためにバインドされているすべての場合後ではない数(名前に反して)です。電話番号、郵便番号、シリアル番号などはテキストデータなので、テキスト(CHAR(10)/ VARCHAR(10 + reserve) - アスキー照合)として保存する必要があります。もちろん、ストレージ要件は非常に大きくなりますが、それは大きくなりますか?とにかく何桁の番号を格納しますか?

数値フィールドに電話番号を格納するために使用されるICQというIM。それをどうやって知るのですか?私の番号は0から始まるからです。

1

電話番号は実際には数字ではありません。 INTsやBIGINTなどの数量は、コンピュータがそのようなサイズで自然に算術演算を行うため、4バイトと8バイトです。

自然なことは、電話番号をCHAR(10)として扱うことです。これは非効率的であると見なすことができます.5がある場合は10バイトを使用しますが、全体のデータ量(名前やアドレスなどの他のデータは確かに大きいです)を考えれば、レコードあたり5バイトの "無駄使い"多く。ディスク容量は安く、プログラマー時間は高価ですが、最も簡単なことは動作します。

+0

また、5バイトのディスクスペースを「節約する」ことは、CPUを無限にバイナリに変換して元に戻す「費用」を考慮すると、損失になります。 –