レールの文字列とテキストの違いは?


435

私はRailsのを使用して新しいWebアプリを作ってるんだ、と思っていた、との違い何stringとはtext?そして、それぞれをいつ使うべきですか?

回答:


522

違いは、シンボルがクエリ言語でそれぞれの列タイプに変換される方法に依存します。

MySQLの場合:文字列はVARCHAR(255)にマップされます-http: //guides.rubyonrails.org/migrations.html

:string |                   VARCHAR                | :limit => 1 to 255 (default = 255)  
:text   | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)

参照:

http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

それぞれいつ使用すべきですか?

一般的な経験則として、:string短いテキスト入力(ユーザー名、電子メール、パスワード、タイトルなど)に使用:textし、説明、コメントの内容など、予想より長い入力に使用します。


11
より良い経験則は、常に使用することだと思います:textdepesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-textを
リードG.法

74
MySQLの場合-それほど多くありませんが、varcharにインデックスを付けることができますが、テキストにはできません。
Omar Qureshi 2013年

12
PostgreSQLの実装はテキストを優先します。pg文字列/テキストの唯一の違いは、文字列の長さの制約です。パフォーマンスの違いはありません。
アンディベティスワース2014年

これはActiveRecordのすべてではありません。MySQLのtruevarchar(ergo、stringtypeフィールド)に値を保存すると、値が1(完全に公平な)にシリアル化されます。ただし、texttypeでは、値「true」を格納すると、単一のcharとしてシリアル化されtます。これを認識せずに列を移行しましたt。値がtrueである将来のすべての行は現在です。誰かがこの行動について何か洞察を持っていますか?
ピーター、

1
@ elli0tこれは、インデックスを作成できないことを意味します。これが重要な場合は、MySQLでテキストを使用しないでください
Omar Qureshi

157

postgresを使用している場合は、テキストとvarcharのパフォーマンスが低下しないためサイズの制約がない限り、可能な限りテキストを使用してください。

空白で埋められたタイプを使用する場合のストレージスペースの増加、および長さ制約のある列に格納する場合に長さをチェックするための追加のCPUサイクルがいくつかあることを除いて、これら3つのタイプ間にパフォーマンスの違いはありません。character(n)には他のいくつかのデータベースシステムではパフォーマンス上の利点がありますが、PostgreSQLにはそのような利点はありません。実際、追加のストレージコストのため、character(n)は通常3つの中で最も遅いです。ほとんどの場合、代わりにテキストまたは文字の変化を使用する必要があります

PostsgreSQLマニュアル


4
しかし、データベースにとらわれないためには、これが最善のアプローチでしょうか?データベースを変更したい場合はどうしますか?現実にはそれほど頻繁に発生しないことを認めますが、それでも...「パフォーマンスの違いがない」場合は、短いものには文字列を使用し、長いものにはテキストを使用することに固執しないのはなぜですか?そして、あなた自身のコメントインデックス文字列を与えられても、それでも最良のアプローチのようです。
Dan Barron、

6
現実の世界でそれが必要になる理由はいくつかありますが、どの問題にも1つの真の解決策があるという考えを捨てるのが最善です。
Dan Barron 2013

14
それはそうかもしれませんが、データベース不可知論は偽の預言者です。
Omar Qureshi

2
パフォーマンスのペナルティが重大であるかどうか、またはこれが時期尚早の最適化のケースであるかどうかについて誰かが情報を持っていますか?私の推測では、違いに気付くことはないでしょう。段落の冒頭で確認しているように、「これら3つのタイプにはパフォーマンスの違いはありません」。
デニス

5
あなたは良い主張をしますが、私は完全には確信していません。そのブログ投稿でtextover (n)データ型を使用することについての議論は説得力がありますが、textover を使用することについての議論varcharはそうではありません。彼は、彼らが同じだと言うが、好むtextためvarcharと混同することができvarchar(n)かつので、text型に少ない文字です。ただし、のtext代わりに使用するとvarchar、保存されるデータが長くなってはならないというコンテキストが失われます。たとえば、ユーザー名をに保存すると、text誤解を招くようです。
デニス

17

文字列はデータベースで「Varchar」に変換され、テキストは「テキスト」に変換されます。varcharに含めることができる項目ははるかに少なく、テキストは(ほぼ)任意の長さにすることができます。

適切なリファレンスを使用した詳細な分析については、http://www.pythian.com/news/7129/text-vs-varchar/を確認してください

編集:一部のデータベースエンジンはvarchar一度にロードできますが、テキスト(およびBLOB)をテーブルの外に格納します。Aは、SELECT name, amount FROM products使用しているとき、たくさん遅くなる可能性textのためにname使用する場合よりもvarchar。Rails以降、デフォルトではSELECT * FROM...、テキスト列を含むレコードがロードされます。これはおそらくあなたや私のアプリで実際の問題になることは決してありません(時期尚早な最適化は...)。しかし、テキストが常に「無料」であるとは限らないことを知っていることは、知っておくと役に立ちます。


12

サイズが固定で小さい場合は文字列、可変で大きい場合はテキスト。テキストは文字列よりもはるかに大きいため、これは一種の重要な要素です。より多くのキロバイトが含まれています。

したがって、小さなフィールドでは常にstring(varchar)を使用します。のようなフィールド。first_name、ログイン、メール、件名(記事または投稿の)およびテキストの例:投稿または記事のコンテンツ/本文。段落などのフィールド

文字列サイズ1〜255(デフォルト= 255)

テキストサイズ1から4294967296(デフォルト= 65536)2


11

上で説明したように、dbデータ型だけでなく、スキャフォールディングの場合に生成されるビューにも影響します。文字列はtext_fieldを生成しますtextはtext_areaを生成します


2

名前、住所、電話、会社などの短いフィールドには文字列を使用します

より大きなコンテンツ、コメント、コンテンツ、段落にはテキストを使用します。

私の一般的なルールは、2行以上の場合は通常テキストを使用し、2〜6語の場合は文字列を使用します。

文字列の公式ルールは255です。したがって、文字列が255文字を超える場合は、テキストを使用してください。


1

oracleを使用している場合... STRINGVARCHAR(255)TEXTとして、はとして作成されますCLOB

NATIVE_DATABASE_TYPES = {
    primary_key: "NUMBER(38) NOT NULL PRIMARY KEY",
    string: { name: "VARCHAR2", limit: 255 },
    text: { name: "CLOB" },
    ntext: { name: "NCLOB" },
    integer: { name: "NUMBER", limit: 38 },
    float: { name: "BINARY_FLOAT" },
    decimal: { name: "DECIMAL" },
    datetime: { name: "TIMESTAMP" },
    timestamp: { name: "TIMESTAMP" },
    timestamptz: { name: "TIMESTAMP WITH TIME ZONE" },
    timestampltz: { name: "TIMESTAMP WITH LOCAL TIME ZONE" },
    time: { name: "TIMESTAMP" },
    date: { name: "DATE" },
    binary: { name: "BLOB" },
    boolean: { name: "NUMBER", limit: 1 },
    raw: { name: "RAW", limit: 2000 },
    bigint: { name: "NUMBER", limit: 19 }
}

https://github.com/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb


1

受け入れられた答えは素晴らしいです、それは文字列とテキストの違いを適切に説明します(主にデータベースの制限サイズですが、他にもいくつか問題点があります)が、その答えとして私を通過させた小さな問題を指摘したかった私のために完全にそれをしませんでした。

最大サイズ:limit => 1〜4294967296は、正確に機能しませんでした。その最大サイズから-1にする必要がありました。私は大きなJSON blobを保存していますが、ときどき巨大になる可能性があります。

これは、MySQLが不満を言わない値で、より大きな値を使用した私の移行です。

制限の最後にある6ではなく5に注意してください。

class ChangeUserSyncRecordDetailsToText < ActiveRecord::Migration[5.1]
  def up
    change_column :user_sync_records, :details, :text, :limit => 4294967295
  end

  def down
    change_column :user_sync_records, :details, :string, :limit => 1000
  end
end

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