MysqlでVARCHAR
列を使用してテーブルを作成するときは、その長さを設定する必要があります。しかしTEXT
型の場合、長さを指定する必要はありません。
VARCHAR
とTEXT
の違いは何ですか?
TEXT
c
バイトのディスク容量を使用します。ここで、c
は格納されている文字列の長さです。VARCHAR(M)
M
文字の可変最大サイズM
は1から65535の間である必要があります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
も使用します。電話番号、名前、またはこのようなもの。それからTINYTEXT
やTEXT
の代わりにVARCHAR(30)
を使うことができ、誰かがあなたの電話番号欄に3つの "Lord of the Ring"の本のテキストを保存しようとすると最初の30文字だけを保存します:)
編集:データベースに保存するテキストが65535文字を超える場合は、MEDIUMTEXT
またはLONGTEXT
を選択する必要があります。ただし、MEDIUMTEXT
は最大16 MBの文字列を保存します。 4 GBまでのLONGTEXT
。 LONGTEXT
を使用し、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 を見てください。
最後に、TEXT
とVARCHAR
はどちらも可変長データ型であるため、データを格納するために必要なスペースが最小限に抑えられることに注意してください。しかし、これはパフォーマンスとのトレードオフを伴います。より良いパフォーマンスが必要な場合は、CHAR
のような固定長の型を使用する必要があります。これについてもっと読むことができます ここ 。