データベースのテキスト列にvarcharを使用する理由はありますか?


36

あるvarcharだけで残りは以前からtext周囲に来た、またはあなたが考えケースが使用されたい使用するにはvarchar?(またはcharそのことについて..)

(私は毎日PostgresとMySQL(MyISAM)を使用しているので、それらは私が最も興味を持っているものですが、他のデータベースへの回答はもちろん歓迎です。^ _-)


6
少なくともSQL Serverの場合、text推奨されていません。また、データの保存場所とそのためのアクセス方法に関連する使用上の考慮事項もあります。
Oded

一部のDBMSでは、sort句またはwhere句でテキスト列を使用できない場合があります。私はPostgresに精通していませんが、ドキュメントを確認してください。
jqa

1
このStackOverflowの質問は、さらに情報を提供する場合があります。
J0ANMM

回答:


32

一般に

text列は非標準であり、実装に固有です。多くの場合、データベースに応じて、彼らは、以下の制限のうちの1つ以上の組み合わせを有していてもよい:刃先交換式ではない検索できないソート可能ではありません

Postgresで

これらのタイプすべて、同じCデータ構造を使用して内部的に保存されます。

MySQLで

このtextは特別なバージョンでBLOBあり、インデックス作成に制限あります。

これらの2つの例は、他のSQL RDBMSシステムに外挿することができ、あるタイプを他のタイプよりも選択するタイミングを理解するのに十分な理由になるはずです。

暗黙的に明確にするために、TEXT独自仕様で非標準なので使用しないでください。どれでもSQLあなたがそれに対して書き込みをしますないポータブルで、あなたの将来に問題を引き起こすことが保証されます。ANSI標準の一部であるタイプのみを使用してください。

  • CHARすべてのエントリに一定の文字数があることがわかっている場合に使用します。
  • VARCHARすべてのエントリに可変数の文字がある場合に使用します。
  • あなたはより多くのストレージが必要な場合はVARCHAR、提供することができCLOBUTF-8エンコーディングまたは同等の標準タイプを。
  • 決して使用しないでTEXT、それは非標準であるとして。

1
とに同意しましたがnon standard and implementation specificnot indexable, not searchable and not sortable私は気づきませんでした。私は印象の下にあったtext 標準化しました。
イズカタ

1
ASCII text標準、UNICODE text標準、または他の半ダースのtextエンコーディング標準の1つですか?

1
SQL標準ドキュメントを掘り下げてみるとtext、文字型として何かを見つけることはないと思います。私は何も見ませんでした、いくつかのベンダーはそれlong charを呼んでいます、そして、それは基本的に、それに接続されたエンコーディングを持つBLOBです。

2
@JarrodRobersonには正直に言って、「常に使用するTEXT」と結論づける(Postgres環境の場合)信頼できるリソースがたくさんあります。別のデータベースに移行する場合、特にpostgresの無制限VARCHAR(TOASTにより、MySQLのような行制限がない)が無制限VARCHARに変換されない可能性があることを考慮する必要があるため、それはほとんど問題になりませんとにかく他のデータベース。
カヤマン

1
...そして、PostgresはCLOBをサポートしていないため、最後から2番目のポイントは成り立ちません。標準に準拠していて、ドロップイン置換をサポートすることはできません。ANSI SQLを書くことは、おもちゃのSQLを書いているのでない限り、現実の世界では実行可能なオプションではありません。
カヤマン

11

textvarcharおよびcharすべて異なる理由で使用されます。もちろん、実装の違い(それらが占めるサイズなど)がありますが、使用法と意図の考慮事項もあります。使用するタイプは、そこに格納されるデータの種類に関する情報も提供します(または、すべてに使用textます)。何かが固定長の場合、を使用しますchar。上限が明確に定義された可変長の場合は、を使用しますvarchar。それがあなたがほとんど制御できないテキストの大きな塊であるtextなら、おそらくあなたの最善の策でしょう。


3
とにかく、唯一の本当の違いは、とにかくプログラムコードにあるはずの境界チェックを複製することですか?
イズカタ

2
@Izkata-実装の違いもあります。それは境界チェックではなく、データに関するものです。(米国)郵便番号は常に5桁のコードであるため、「char」のようなものを使用すると、このデータの定義の一部になります。それは境界チェックのような唯一のものだった場合、私たちはすべてただのための1つのデータ型使用できるすべてのものを、私たちのチェックとキャストのコード側を行います。
システムダウン

6
@SystemDown私の知る限り、charvarchar、とは、textすべて同じ格納するために設計されているタイプのデータを。したがって、ここでの両方の答えは、境界チェックに関するものです。効率の違いがある場合、それらは何ですか? なぜvarcharover を使用するのtextですか?
イズカタ

1
floatとdoubleも同じタイプのデータに使用されますが、違いがあり、使用方法が異なります。実装の違いについては、私はPostgresに十分な知識がなく、恐れていると答えることができません。
システムダウン

4
@SystemDown郵便番号をchar(5)として保存すると、国際化を開始した場合に噛み付く可能性があります。英国の郵便番号は長さが異なり、5文字ではほとんど十分ではありません。ただし、英国の郵便番号のスペースが解析に関連するかどうかはわかりません。
バティーン

5

データベースは、パフォーマンスつまり速度ストレージの最小化に大きな関心を寄せています。コンピュータの世界の他のほとんどの部分では、文字列に含まれる文字数について気にすることはありません。1つでも、百科事典の内容全体でもかまいません。それはすべて単なる文字列です。実際、多くの言語は文字列か数字かを気にしません。

しかし、コンピューターがより高速になり、より多くのメモリを獲得するにつれて、人々はより多くのデータをデータベースに入れて、よりクエリを実行します。データベースの場合、CPUとメモリは、64 KBのメインメモリと10 MBのハードドライブ(メインフレームコンピューター上)の時代と同様に、今日では制限されています。

固定長のバイトは、可変長の数字よりもはるかに扱いやすいです。10バイトは1,000,000よりもはるかに簡単に処理できます。したがって、データベースでは、テラバイト単位のデータからマイクロ秒単位で数ギガバイトの結果を得ることができるように、データベースに手がかりを与えたいと考えています。データベースをそれほど熱心に使用していない場合、データベースが提供する速度は必要なく、不必要な質問に悩まされます。ただし、パフォーマンスが必要な場合は、喜んでヒントを提供してください。

他の回答で述べたように、使用することは、charそれは常に、特定の文字数を使用した場合varcharの長さは変化することができますが、それが大きくなりすぎていない場合は(私の推測ではあるほとんどのDBのように扱うことをchartextサイズに応じて)、およびtextそれならば長さは任意です。あなたのSQLを使用しようとする場合はtext、列を、それが何らかの形でそれを要約し、それを置くために最善であるかもしれないcharか、小さなvarchar、列、そしてやるwhereのをしてorder by'は上です。もちろん、それはパフォーマンスがあなたにとって重要な場合のみです。

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