web-dev-qa-db-ja.com

データベース内の整数と文字列

データベースでデータ型を定義するとき、特定の「数値」データを格納するために整数と文字列のどちらを使用するかを選択する際に常に問題がありました。

私が構築しているとしましょう まだ別の住所 そして郵便番号フィールドがあります。郵便番号が常に4桁の数字である場合、どのデータ型として保存しますか?整数または文字列?技術的には整数ですが、私はそれに対していかなる種類の計算も行っておらず、テーブルに吐き出しているだけです。郵便番号でテーブルを並べ替えたい場合、あなたの意見は変わりますか?

今、私は愚かではありません。ページビューや一意のユーザー、ログインユーザーやゲストユーザーなどの整数の有効な必要性を認識しています。しかし、トレントにあるファイルの数を保存するのはどうですか?整数または文字列?

24
Josh Hunt

私の国では、郵便番号も常に4桁です。ただし、最初の桁はゼロにすることができます。

「0700」を整数として格納すると、多くの問題が発生する可能性があります。

  • 8進値として読み取ることができます
  • 10進値として正しく読めば「700」になります
  • 値「700」を取得したら、ゼロを追加することを忘れないでください
  • 後でゼロを追加しませんが、「700」が「0700」なのか、誰かが「7100」とタイプミスしたのかをどうやって知ることができますか?

技術的には、郵便番号は常に4桁であっても、実際には文字列です。

スペースを節約するために、それらを整数として格納できます。ただし、これは単純なDBトリックであることを忘れないでください。また、先行ゼロに注意してください。

しかし、トレントにあるファイルの数を保存するのはどうですか?整数または文字列?

それは明らかに整数です。

38
myplacedk

私は常に次のルールを使用します。

数学的な計算(加算/減算など)を実行する場合は、整数またはその他の数値データ型にします。

フィールドで数学計算を実行する予定がない場合は、文字列として保存します。

郵便番号のインスタンスでは、郵便番号に加算したり、2つの郵便番号を減算または乗算したりする必要がある時間はありません。数学関数は、数量ではなく識別子として使用されるため、通常、郵便番号では使用されません。したがって、郵便番号を文字列データ型として保存する必要があります

29
TheTXI

郵便番号についての私の意見では、文字列を使用する必要があります。ゼロ(09100)で始まる郵便番号を使用でき、整数を使用すると9100になるためです。アルファベット順( ' 09100 'は' 09101 'の前にあります)。ファイル番号を保存する場合は、干渉が予想されるので、ファイル番号の増減に問題はありません。したがって、整数と文字列は、使用方法によって異なります。

10
Enrico Murru

これはセマンティクスの問題です。ストレージに適切なデータ型を決定しようとしていますが、これは難しい質問になる可能性があります。データを整数として使用する必要がある場合は、データを整数として保存することをお勧めします。

つまり、郵便番号を番号として使用することは決してないため、1つとして保存することは意味がありません。データがどのようなものであるかは関係ありません見た目、それが何であるかは重要ですis。郵便番号は番号ですか?いいえ、それはたまたま完全に数字で構成されている文字列です。したがって、郵便番号は文字列として保存するのが最適です。

9
Andrew Hare

郵便番号に関する限り、これは典型的な英国の郵便番号です。

EC2R 6PK

大学では、私のデータベースの講師が、私に固執し、15年以上経ってもまだ保持していることを教えてくれました。

算術演算を行う場合は、数値として保存してください。それ以外の場合は文字列です。

率直に言って、私はあなたがそのアドバイスで間違って行くことができるとは思わない。

明らかに、郵便番号に対して算術演算を実行しないため、郵便番号は文字列です。

6
cletus

郵便番号は数字ではなく、コードまたは識別子です。同じことが電話番号にも当てはまります。

トレント内のファイルの数は整数です。

特に、この場合、CHECK CONSTRAINT LIKE '[09][09][09][09]'を作成して、データベースレベルでデータを正しく保つことができます。

5
gbn

郵便番号の場合、文字列を選択します。本質的に整数ではありません。これは何かの単なる識別子であり、一連の4文字である可能性もあります。

トレント内のファイルの数は整数である必要があります。

2

「0000」は郵便番号ですか? '0'とは異なりますか?

常に4桁の数字の場合、常に4桁で保存します。これは、文字列として保持することを意味します。

2
Brian Agnew

データに対して数学を行う予定がない限り、数値データ型は使用しません。あなたが「確信している」何かのために将来問題を見つけるリスクを冒す理由は、常に誰かが非数字文字を入れることに決めた数字になるでしょう。

あなたがそれで数学をするつもりがないならば、それを文字列にしてください。

1
Jim Blizard

また、すべての国のすべての郵便番号が数字だけであるとは限らないことを覚えておくのもよいでしょう。現在カナダに住所がないからといって、住所がないというわけではありません。私はいつもルールを守ってきました。数学の計算をしたい場合は数値型で保存し、コード(郵便番号、電話、SSN、部品番号など)の場合は、文字列として保存します。避けたいのは、呼び出すたびにデータを別の形式に不必要にキャストすることです(たとえば、郵便番号を数値として保存する場合は先行ゼロを追加するコード、または文字列を計算用の数値に変換するコード)。これらを繰り返し実行する必要がある場合、特にテーブルが大きく、where句で変換を実行する必要がある場合は、コストのかかる操作になる可能性があります。必要な方法でデータを保存することをお勧めします。

1
HLGEM

使用しているデータのセマンティクスを理解することは常に重要です。例で説明します。

PINをデータベースに保存することを検討してください。使用するデータ型に答えるには、最初に何に答える必要がありますPIN( 個人識別番号 )は本当に意味します。

  1. その名前が本当に示すようにそれが本当に数字であるならば、それが整数として表されるべきではない理由はわかりません。

    0001と01を区別できないと主張する人もいるかもしれません。明らかに、彼らはPINの数値を考慮しておらず、そのようなセマンティクスを使用している場合は、文字列を使用する必要があります。

    注:PIN長さが4桁に固定される場合、任意の数値は常に先行ゼロで埋められ、まったく同じように記述されるため、整数を使用できます。 (0001は01と同じになります)-ただし、これらの固定長の制限は、誤った入力を避けるための数値の一般的なものです。

  2. セマンティクスでPINは数値である、つまりPIN 0001はPIN 01、I整数表現を使用します。

したがって、あなたの場合、 郵便番号 セマンティクスを理解することが重要です。そのセマンティクスは国によって異なる可能性があるため(または時間の経過とともに変化することもあります)、どちらを使用するかも重要です。あらゆる種類の郵便番号と可能な変更をカバーするために、私はより抽象的なデータ型または文字列のみを使用することを検討します(私はすでに含むセマンティクスがあると信じています単なる数字よりも多くの文字)。

データ表現に対する算術演算に関するルールなどの単純化されたルールに従うことはお勧めしません。現在データを使用して数学演算を実行したくない場合でも、将来的には必要ない場合があります。

データがあり、それを保存し、何らかの形で表現したい-単に、作業しているものについて考えてみてください。

0
arenaq

郵便番号は文字列です。一部のcomtriesでは、これらの文字列は1桁の数字で構成されている場合がありますが、整数にはなりません。そして遅かれ早かれ、あなたの潜在的なシステムは数字を使い果たし、文字も使い始めることを決定するでしょう。データベースが郵便番号フィールドに整数を使用している場合、あなたは深いドゥードゥーになります。

結論-算術演算を行わない場合、それはおそらく実際には数値ではありません。

0
anon

重要な決定要因であるimhoは、アプリケーションが値に対して数値算術計算を行う必要があるかどうかです。そうでない場合、整数を使用する唯一の理由は、ストレージ要件を減らすことです(これは重要なパフォーマンスにとって重要である可能性があります)。アプリケーション-テーブルインデックスの幅を減らしてインデックスのパフォーマンスを向上させるなど)が、それ以外の場合は一般的に重要ではありません...

値を使用して算術演算を行う必要がない場合は、文字列が最適です。

0
Charles Bretana

数学演算を実行する予定がない場合でも、郵便番号を数値として保存しても問題はありません。

私たちの企業データウェアハウスでは、私たちは多くのレガシーシステムからのデータの受信者です。その結果、多くのガベージデータが使用されていることがわかります。

ゼロで埋められた4桁の「数値」である地理的識別子がある場合を考えてみましょう。このフィールドは、テーブルを結合するためによく使用されます。

2つのアプローチのいずれかを取ります:1)列を長さ4のcharフィールドとして宣言し、CONSTRAINT LIKE '[09] [09] [09] [09]'を追加します。2)数値の長さ4として定義します。ユーザーが必要な場合は、表示時にのみ値をフォーマットします。

数値1にアプローチすると、常にフォーマットする手間が省けます。これは大したことではありませんが、列をフィルタリングしたり、インデックスを作成したり、結合したりすることが多い場合は、オプション#2を使用しないことを検討してください。

3番目の理由は、私の経験では、データベースに制約を追加することに関して、人々は単に怠惰であるか、無知であるということです。個人的にはもっと怠惰だと思います。存在する制約は、ほとんどの場合、元々データをキャプチャするアプリケーションの編集として適用され、編集が均一に適用されないことがわかりました。

その結果、データウェアハウスは、ゼロの不整合な事前入力や値の正当化など、あらゆる種類のバリエーションを受け取ることになります。

何かをINTEGERとして定義すると、特に、より効率的なストレージが自動的に取得されます。列にインデックスを付けるとき、そして誰もが理解し、さまざまな能力のデータベース設計者によってレガシーシステム全体に一貫して適用される可能性が高い編集。

オプション#1に問題はありませんが、インデックスでフィールドを使用することと、フィールドをapha数値として受け入れると、人々はより多くのがらくたをそのフィールドに投げ込む傾向があるというアプローチについての私の懸念を除いて。

たとえば、Peoplesoftの従業員IDを考えてみましょう。誰かが、従業員が請負業者であることを示すために、従業員の6文字のゼロで埋められた「番号」の前に「X」を追加することにしました。これは、別々の情報を1つのフィールドに結合しないという私の個人的な慣習に違反します。これにより、さまざまなシステム間であらゆる種類の不整合の問題が発生しました。このフィールドが数値の場合、誰もそれを試みなかったでしょう。

コメント?

0
ChadD

「常に」は「翌月」を意味する場合があります。私は自分の責任の存続期間内に英数字にならない4桁のコードを当てにしません。

SQLの一部の方言は、NUMBER(4)のようなデータタイプをサポートしています。これは文字列のように機能しますが、アルファベットは0から9です。

0
Walter Mitty