違いは何であるCharField()
とTextField()
Djangoのでは?ドキュメントはその言うCharField()
小さな文字列を使用する必要があり、TextField()
大きな文字列を使用する必要があります。わかりましたが、「小さい」と「大きい」の間に描かれた線はどこにありますか?これを裏付けるフードの下で何が起こっているのですか?
違いは何であるCharField()
とTextField()
Djangoのでは?ドキュメントはその言うCharField()
小さな文字列を使用する必要があり、TextField()
大きな文字列を使用する必要があります。わかりましたが、「小さい」と「大きい」の間に描かれた線はどこにありますか?これを裏付けるフードの下で何が起こっているのですか?
回答:
これは、RDBMS varchar
(または類似)の違いです。これらは通常、最大長で指定され、パフォーマンスまたはストレージtext
(および類似)の点でより効率的かもしれません。これらは通常、ハードコードされた実装制限によってのみ制限されます( DBスキーマ)。
具体的には、PostgreSQL 9には「これら3つのタイプにはパフォーマンスの違いはない」とありますが、MySQLなどにはいくつかの違いがあるため、注意が必要です。
経験則としてはCharField
、最大長を制限する必要がある場合に使用し、TextField
そうでない場合はそれを使用します。
これもDjango固有のものではありません。
TextField
デフォルトで使用すると、アプリの移植性に影響を与える可能性があることがわかりました。Postgresのパフォーマンスに影響はないかもしれませんが、OracleはCLOB
WHEREステートメントでフィールドを使用できないなどの不快な点があるものとして格納します。考慮すべきことだけです。
CharField
をmax_length
超えることはできないため、ORA-00910: specified length too long for its datatype
エラーが発生することも考慮する必要があります。
場合によっては、フィールドの使用方法に関連しています。一部のDBエンジンでは、フィールドの違いによって、フィールド内のテキストを検索する方法(および検索する場合)が決まります。CharFieldsは通常、文字列「one plus two」で「one」を検索する場合など、検索可能なものに使用されます。文字列は短いため、エンジンが検索するのにかかる時間は短くなります。通常、TextFieldは(ブログの本文などの)検索対象ではなく、大量のテキストを保持するためのものです。現在、これのほとんどはDBエンジンに依存しており、Postgresのように問題ではありません。
問題にならない場合でも、ModelFormを使用すると、フォームに別のタイプの編集フィールドが表示されます。ModelFormは、CharFieldには1行のテキスト、TextFieldには複数行のサイズのHTMLフォームを生成します。
たとえば。以下のようなモデルに2つのフィールドが追加されます。
description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)
以下は、移行が適用されたときに実行されるmysqlクエリです。
以下のためにTextField
(説明)フィールドがAのように定義されますlongtext
ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;
TextField
MySQL の最大長はstring-type-overviewによると4GB です。
以下のためにCharField
(タイトル)MAX_LENGTH(必須)のように定義されますvarchar(64)
ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
Avoid using null on string-based fields such as CharField and TextField
::docs.djangoproject.com/en/2.0/ref/models/fields/#nullを維持するのが最善null=False
です。
私は奇妙な問題を抱えていて、不愉快な奇妙な違いを理解しました:ユーザーからCharFieldとしてURLを取得し、それをhtmlのhrefのタグで使用すると、そのURLが私のURLに追加されますが、それは私が望むものではありません。しかし、Textfieldでそれを行うと、ユーザーが入力したURL だけが渡されます。これらを見てください:私のウェブサイトアドレス:http://myweb.com
CharField Entery: http://some-address.com
それをクリックすると: http://myweb.comhttp://some-address.com
TextField入力: http://some-address.com
それをクリックすると: http://some-address.com
URLは2つの方法でDBにまったく同じように保存されますが、クリックしたときに結果が異なる理由がわかりません。