mysqlでVARCHAR
カラムを持つテーブルを作成した場合、そのカラムの長さを設定する必要があります。しかし、TEXT
型では長さを指定する必要はありません。
VARCHARと
TEXT`の違いは何ですか?
TEXT
c
バイトのディスクスペースを必要とする(ここで c
は格納される文字列の長さ)。varchar(m)`。
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
を使用したい場合もあります。例えば、電話番号や名前などです。そうすると、TINYTEXT
やTEXT
の代わりにVARCHAR(30)
を使うことができ、誰かが電話番号カラムに3冊の指輪物語のテキストを保存しようとしても、最初の30文字だけが保存されます :)
Edit: データベースに保存したいテキストが65535文字より長い場合、MEDIUMTEXT
かLONGTEXT
を選択しなければなりませんが、注意が必要です: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 バイト) になります。
詳しくは、ドキュメントをご覧ください。
最後に、TEXT
とVARCHAR
はどちらも可変長のデータ型であるため、データを保存するためのスペースを最小限に抑えることができます。しかし、これはパフォーマンスとのトレードオフになります。より良いパフォーマンスが必要な場合は、CHAR
のような固定長のデータ型を使用する必要があります。これについては、ここで詳しく説明されています。