web-dev-qa-db-ja.com

mysqlにおけるVARCHARとTEXTの違い

MysqlでVARCHAR列を使用してテーブルを作成するときは、その長さを設定する必要があります。しかしTEXT型の場合、長さを指定する必要はありません。

VARCHARTEXTの違いは何ですか?

217
user3840485

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からM = 2¹⁶-1までがあります。
したがって、TEXTのサイズは選択できませんが、VARCHARのサイズは選択できます。

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

ただし、可能な入力文字列の最大長がVARCHARのみであることがわかっている場合は、Mも使用します。電話番号、名前、またはこのようなもの。それからTINYTEXTTEXTの代わりにVARCHAR(30)を使うことができ、誰かがあなたの電話番号欄に3つの "Lord of the Ring"の本のテキストを保存しようとすると最初の30文字だけを保存します:)

編集:データベースに保存するテキストが65535文字を超える場合は、MEDIUMTEXTまたはLONGTEXTを選択する必要があります。ただし、MEDIUMTEXTは最大16 MBの文字列を保存します。 4 GBまでのLONGTEXTLONGTEXTを使用し、PHPを介してデータを取得する場合(少なくともstore_resultを指定せずにmysqliを使用する場合)、PHPが4 GBのメモリを割り当てようとするため、おそらくメモリ割り当てエラーになります。文字列全体を確実にバッファできるようにするため。これはPHP以外の言語でも起こるかもしれません。

ただし、常に入力をチェックする必要があります(長すぎますか?奇妙なコードが含まれていますか?)beforeデータベース内。

注意:どちらのタイプでも、必要なディスク容量は格納されている文字列の長さにのみ依存し、最大長には依存しません。
Eg文字セットlatin1を使用してテキスト「Test」をVARCHAR(30)VARCHAR(100)、およびTINYTEXTに格納する場合、常に5バイト(格納に1バイト)が必要です。文字列の長さと各文字に1バイト)同じテキストをVARCHAR(2000)列またはTEXT列に格納すると、同じスペースも必要になりますが、この場合は6バイトになります(文字列長を格納するには2バイト、各文字に1バイト)。

より詳しい情報は documentation を見てください。

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

415
AbcAeffchen