web-dev-qa-db-ja.com

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

varchartextが登場する前の残党ですか、それともwantを使用してvarcharを使用するユースケースはありますか? (または、charそのことについて..)

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

37
Izkata

一般に

text列は非標準で実装固有です。多くの場合、データベースに応じて、次の制限の1つ以上の組み合わせがある場合があります:not indexablenot searchableおよび並べ替え不可

Postgres内

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

MySQLでは

text_BLOB の特殊バージョンであり、索引付けに制限があります。

これらの2つの例は、他のSQL RDBMSシステムに外挿することができ、どちらのタイプを選択するかを理解するのに十分な理由になります。

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

  • 各エントリの文字数が決まっていることがわかっている場合は、CHARを使用します。
  • 各エントリの文字数が可変の場合は、VARCHARを使用します。
  • VARCHARが提供できる以上のストレージが必要な場合は、CLOB with UTF-8エンコーディングまたは同等の標準タイプ。
  • [〜#〜]決して[〜#〜]TEXTは非標準なので使用してください。
33
user7519

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

12
System Down

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

しかし、コンピューターが高速になり、より多くのメモリを獲得すると、人々はより多くのデータをデータベースに入れ、より洗練されたクエリを実行します。データベースの場合、CPUとメモリは、64Kbのメインメモリと10Mbのハードドライブ(mainframeコンピュータ上)の時代と同じように、今日も制限されています。

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

他の回答で述べたように、常に特定の数の文字を使用する場合はcharを使用し、長さが変化する可能性があるが長すぎない場合はvarcharを使用します(my guessは、ほとんどのDBがcharまたはtextとしてサイズに応じて処理します)、およびtext(任意の長さの場合)。 SQLがtext列を使用しようとする場合、何らかの方法で要約してcharまたは小さなvarchar列に配置し、where 's and order byはその上です。もちろん、それはパフォーマンスが重要な場合のみです。

5
RalphChapin