web-dev-qa-db-ja.com

Django CharField vs TextField

DjangoのCharField()TextField()の違いは何ですか? ドキュメント は、小さな文字列にはCharField()を使用し、大きな文字列にはTextField()を使用する必要があることを示しています。わかりましたが、「小」と「大」の間に線が引かれていますか?ここでフードの下で何が起こっているのですか?

258

RDBMSのvarchar(または類似)—通常は最大長で指定され、パフォーマンスまたはストレージの点でより効率的かもしれません—とtext(または類似)タイプ—通常、ハードコードされた実装制限( DBスキーマではありません)。

PostgreSQL 9では、具体的には、 「これらの3つのタイプにパフォーマンスの違いはありません」 ですが、知る限りではいくつかの違いがあります。 MySQL、これは心に留めておくべきものです。

目安として、最大長を制限する必要がある場合はCharFieldを使用し、それ以外の場合はTextFieldを使用します。

これは実際にはDjango固有ではありません。

294
Cat Plus Plus

場合によっては、フィールドの使用方法に関係しています。一部のDBエンジンでは、フィールドの違いにより、フィールド内のテキストを検索する方法(および検索するかどうか)が決まります。 CharFieldsは通常、文字列「one plus two」で「one」を検索する場合など、検索可能なものに使用されます。文字列は短いため、エンジンが検索するのにかかる時間は短くなります。 TextFieldsは通常、検索対象ではなく(ブログの本文のように)、大量のテキストを保持するためのものです。現在、これのほとんどはDBエンジンに依存しており、Postgresのように重要ではありません。

重要ではない場合でも、ModelFormsを使用すると、フォームに異なるタイプの編集フィールドが表示されます。 ModelFormは、CharFieldでは1行のテキスト、TextFieldでは複数行のサイズのHTMLフォームを生成します。

31
renderbox

たとえば。以下のようなモデルに2つのフィールドが追加されます。

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)

以下は、移行が適用されたときに実行されるmysqlクエリです。


TextField(description)の場合、フィールドはlongtextとして定義されます

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;

MySQLのTextFieldの最大長は、 string-type-overview に従って4GBです。


CharField(title)の場合、max_length(required)はvarchar(64)として定義されます

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
7
SuperNova

CharFieldの最大長は255文字ですが、TextField255文字を超えることができます。入力として大きな文字列がある場合は、TextFieldを使用します。 max_lengthパラメーターがTextFieldに渡されると、長さの検証がTextAreaウィジェットに渡されることを知っておくと便利です。

6
Njeru Cyrus