mysqlのVARCHARとTEXTの違いについて。

mysqlでVARCHARカラムを持つテーブルを作成した場合、そのカラムの長さを設定する必要があります。しかし、TEXT型では長さを指定する必要はありません。

VARCHARTEXT`の違いは何ですか?

質問へのコメント (1)
ソリューション

TL;DR

TEXT

  • 最大文字数65535文字固定(最大文字数を制限することはできません。)
  • は、2 + c バイトのディスクスペースを必要とする(ここで c は格納される文字列の長さ)。
  • インデックスの一部とすることはできない

varchar(m)`

  • M` 文字の最大サイズを可変にする
  • Mは1〜65535の間である必要があります。
  • は1 + c バイト(M ≤ 255)または2 + c (256 ≤ M ≤ 65535)バイトのディスクスペースを必要とし、cは保存された文字列の長さです。
  • は、インデックスに含まれることができる

詳細はこちら

TEXTの最大サイズは**固定**で、2¹⁶-1 = 65535文字です。
VARCHARの最大サイズはM**variable** 最大でM = 2¹⁶-1です。 つまり、TEXTのサイズは選べませんが、VARCHAR`のサイズは選べます。

もう一つの違いは、TEXTカラムにインデックス(フルテキストインデックスを除く)を付けることができないことです。
そのため、カラムにインデックスを付けたい場合は、VARCHARを使用する必要があります。しかし、インデックスの長さにも制限があることに注意してください。もし VARCHAR カラムが長すぎる場合は、インデックスに VARCHAR カラムの最初の数文字のみを使用しなければなりません (CREATE INDEX のドキュメントを参照してください)。

しかし、入力可能な文字列の最大長が M だけであることがわかっている場合、VARCHAR を使用したい場合もあります。例えば、電話番号や名前などです。そうすると、TINYTEXTTEXTの代わりにVARCHAR(30)を使うことができ、誰かが電話番号カラムに3冊の指輪物語のテキストを保存しようとしても、最初の30文字だけが保存されます :)

Edit: データベースに保存したいテキストが65535文字より長い場合、MEDIUMTEXTLONGTEXTを選択しなければなりませんが、注意が必要です:MEDIUMTEXTは最大16MB、LONGTEXTは最大4GBまでの文字列を保存できます。LONGTEXT を使用して PHP でデータを取得した場合 (少なくとも store_result を使用せずに mysqli を使用した場合)、メモリ割り当てエラーが発生する可能性があります。 PHP は文字列全体をバッファリングできるように 4GB のメモリを割り当てようとするためです。これは、PHP 以外の言語でも発生する可能性があります。

しかし、データベースに保存する前に、必ず入力をチェックする必要があります(長すぎないか、奇妙なコードが含まれていないか)

お知らせします:どちらのタイプでも、必要なディスク容量は保存される文字列の長さのみに依存し、最大長には依存しません。
E.g. charset latin1 を使用して、テキスト "Test" を VARCHAR(30), VARCHAR(100), TINYTEXT に格納すると、常に5バイト(文字列の長さを格納するために1バイト、各文字に1バイト)必要になります。同じテキストを VARCHAR(2000)TEXT カラムに格納する場合も同じスペースが必要になりますが、この場合は 6 バイト (文字列の長さを格納するための 2 バイトと各文字のための 1 バイト) になります。

詳しくは、ドキュメントをご覧ください。

最後に、TEXTVARCHARはどちらも可変長のデータ型であるため、データを保存するためのスペースを最小限に抑えることができます。しかし、これはパフォーマンスとのトレードオフになります。より良いパフォーマンスが必要な場合は、CHARのような固定長のデータ型を使用する必要があります。これについては、ここで詳しく説明されています。

解説 (12)