回答:
違いは、シンボルがクエリ言語でそれぞれの列タイプに変換される方法に依存します。
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)
参照:
それぞれいつ使用すべきですか?
一般的な経験則として、:string
短いテキスト入力(ユーザー名、電子メール、パスワード、タイトルなど)に使用:text
し、説明、コメントの内容など、予想より長い入力に使用します。
true
varchar(ergo、string
typeフィールド)に値を保存すると、値が1
(完全に公平な)にシリアル化されます。ただし、text
typeでは、値「true」を格納すると、単一のcharとしてシリアル化されt
ます。これを認識せずに列を移行しましたt
。値がtrueである将来のすべての行は現在です。誰かがこの行動について何か洞察を持っていますか?
postgresを使用している場合は、テキストとvarcharのパフォーマンスが低下しないためサイズの制約がない限り、可能な限りテキストを使用してください。
空白で埋められたタイプを使用する場合のストレージスペースの増加、および長さ制約のある列に格納する場合に長さをチェックするための追加のCPUサイクルがいくつかあることを除いて、これら3つのタイプ間にパフォーマンスの違いはありません。character(n)には他のいくつかのデータベースシステムではパフォーマンス上の利点がありますが、PostgreSQLにはそのような利点はありません。実際、追加のストレージコストのため、character(n)は通常3つの中で最も遅いです。ほとんどの場合、代わりにテキストまたは文字の変化を使用する必要があります
text
over (n)
データ型を使用することについての議論は説得力がありますが、text
over を使用することについての議論varchar
はそうではありません。彼は、彼らが同じだと言うが、好むtext
ためvarchar
と混同することができvarchar(n)
かつので、text
型に少ない文字です。ただし、のtext
代わりに使用するとvarchar
、保存されるデータが長くなってはならないというコンテキストが失われます。たとえば、ユーザー名をに保存すると、text
誤解を招くようです。
文字列はデータベースで「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...
、テキスト列を含むレコードがロードされます。これはおそらくあなたや私のアプリで実際の問題になることは決してありません(時期尚早な最適化は...)。しかし、テキストが常に「無料」であるとは限らないことを知っていることは、知っておくと役に立ちます。
名前、住所、電話、会社などの短いフィールドには文字列を使用します
より大きなコンテンツ、コメント、コンテンツ、段落にはテキストを使用します。
私の一般的なルールは、2行以上の場合は通常テキストを使用し、2〜6語の場合は文字列を使用します。
文字列の公式ルールは255です。したがって、文字列が255文字を超える場合は、テキストを使用してください。
oracleを使用している場合... STRING
はVARCHAR(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 }
}
受け入れられた答えは素晴らしいです、それは文字列とテキストの違いを適切に説明します(主にデータベースの制限サイズですが、他にもいくつか問題点があります)が、その答えとして私を通過させた小さな問題を指摘したかった私のために完全にそれをしませんでした。
最大サイズ: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
:text
。depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-textを