TL; DR
TEXT
- 65535文字の最大サイズを修正しました(最大サイズを制限することはできません)
- 2 +
cを取ります ディスクスペースのバイト。ここで、cは保存された文字列の長さです。 - (完全に)インデックスの一部にすることはできません。プレフィックスの長さを指定する必要があります。
VARCHAR(M)
-
Mの可変最大サイズ 文字 -
M1〜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のような固定長タイプを使用する必要があります 。この