TL; DR
TEXT
- 65535文字の最大サイズを修正しました(最大サイズを制限することはできません)
- 2 +
c
を取ります ディスクスペースのバイト。ここで、c
は保存された文字列の長さです。 - (完全に)インデックスの一部にすることはできません。プレフィックスの長さを指定する必要があります。
VARCHAR(M)
-
M
の可変最大サイズ 文字 -
M
1〜65535である必要があります - 1 +
c
を取ります バイト(M
の場合 ≤255)または2 +c
(256≤M
の場合 ≤65535)c
のディスクスペースのバイト 保存された文字列の長さです - インデックスの一部にすることができます
詳細h3>
TEXT
修正済み 2¹⁶-1 = 65535
の最大サイズ 文字。VARCHAR
変数があります 最大サイズM
最大 M = 2¹⁶-1
。
したがって、TEXT
のサイズを選択することはできません ただし、VARCHAR
の場合は可能です 。
もう1つの違いは、TEXT
にインデックス(フルテキストインデックスを除く)を配置できないことです。 列。
したがって、列にインデックスを付ける場合は、VARCHAR
を使用する必要があります。 。ただし、インデックスの長さも制限されていることに注意してください。そのため、VARCHAR
列が長すぎるため、VARCHAR
の最初の数文字のみを使用する必要があります インデックスの列(CREATE INDEX
。
ただし、VARCHAR
も使用する必要があります 、可能な入力文字列の最大長がM
のみであることがわかっている場合 、例:電話番号や名前など。次に、VARCHAR(30)
を使用できます TINYTEXT
の代わりに またはTEXT
そして、誰かが3冊すべての「ロードオブザリング」の本のテキストを電話番号の列に保存しようとすると、最初の30文字だけが保存されます:)
編集: データベースに保存するテキストが65535文字より長い場合は、MEDIUMTEXT
を選択する必要があります。 またはLONGTEXT
、ただし注意してください:MEDIUMTEXT
最大16MBの文字列を格納します。LONGTEXT
最大4GB。 LONGTEXT
を使用する場合 PHP経由でデータを取得します(少なくともmysqli
を使用する場合) store_result
なし )、文字列全体をバッファリングできるようにするためにPHPが4 GBのメモリを割り当てようとするため、メモリ割り当てエラーが発生する可能性があります。これは、PHP以外の言語でも発生する可能性があります。
ただし、常に 入力を確認してください(長すぎますか?奇妙なコードが含まれていますか?)前 データベースに保存します。
注意:どちらのタイプでも、必要なディスク容量は、格納されている文字列の長さのみに依存し、最大長には依存しません。
例 文字セットlatin1を使用し、テキスト「Test」をVARCHAR(30)
に保存する場合 、VARCHAR(100)
およびTINYTEXT
、常に5バイトが必要です(文字列の長さを格納するために1バイト、各文字に1バイト)。同じテキストをVARCHAR(2000)
に保存する場合 またはTEXT
列の場合も同じスペースが必要になりますが、この場合は6バイトになります(文字列の長さを格納するために2バイト、各文字に1バイト)。
詳細については、ドキュメント をご覧ください。 。
最後に、TEXT
の両方の通知を追加します およびVARCHAR
は可変長のデータ型であるため、データを格納するために必要なスペースを最小限に抑える可能性があります。ただし、これにはパフォーマンスとのトレードオフが伴います。より良いパフォーマンスが必要な場合は、CHAR
のような固定長タイプを使用する必要があります 。この