回答:
varcharの最大長は、MySQLの最大行サイズの影響を受けます。これは64KBです(BLOBは含まれません)。
VARCHAR(65535)
ただし、マルチバイト文字セットを使用すると、制限が低くなることに注意してください。
VARCHAR(21844) CHARACTER SET utf8
ここではいくつかの例を示します。
行の最大サイズは65535ですが、varcharには、指定された文字列の長さをエンコードするための1バイトまたは2バイトも含まれます。したがって、テーブル内の唯一の列であっても、最大行サイズのvarcharを宣言することはできません。
mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
しかし、長さを減らしてみると、機能する最大の長さがわかります。
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
ここで、テーブルレベルでマルチバイト文字セットを使用しようとすると、各文字が複数バイトとしてカウントされることがわかります。UTF8文字列は文字列ごとに複数のバイトを使用する必要はありませんが、MySQLは将来のすべての挿入をシングルバイト文字に制限することを想定できません。
mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead
最後のエラーが私たちに言ったにもかかわらず、InnoDBは21845の長さがまだ好きではありません。
mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
これは、21845 * 3 = 65535と計算すれば完全に理にかなっています。一方、21844 * 3 = 65532は機能します。
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
DEFAULT
列の値を宣言したい場合を除きます。TEXT型やBLOB型ではできません。
TEXT
長さ制限は64Kです。 MEDIUMTEXT
長さの制限は16Mです。 LONGTEXT
長さ制限は4Gです。
varchar(max)
列タイプには適用されません。
TLDR; MySqlには同等の概念がありませんvarchar(max)
。これはMS SQL Serverの機能です。
varchar(max)
Microsoft SQL Serverの機能です。
バージョン2005より前のバージョンのMicrosoft SQL Serverで列に格納できるデータの量は8KBに制限されていました。以上8キロバイト以上保管するためには、使用する必要がありますTEXT
、NTEXT
またはBLOB
、8Kページの集合としてのデータを格納し、これらの列の型は、テーブルのデータ・ページとは別の列タイプを。1行あたり最大2GBの保存をサポートしました。
これらの列型に大きな注意点は、彼らは通常、(例えばアクセスに特別な機能や文を必要とし、データを変更することだったREADTEXT
、WRITETEXT
とUPDATETEXT
)
SQL Server 2005ではvarchar(max)
、大きな列のデータの取得と変更に使用されるデータとクエリを統合するために導入されました。varchar(max)
列のデータは、テーブルデータページとインラインで格納されます。
MAX列のデータが8KBのデータページを満たすと、オーバーフローページが割り当てられ、前のページがそれをポイントしてリンクリストを形成します。異なりTEXT
、NTEXT
、および列タイプは、他の列の型と同じクエリのセマンティクスは、すべてのサポートされています。BLOB
varchar(max)
だからvarchar(MAX)
本当に意味しvarchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)
、ではないvarchar(MAX_SIZE_OF_A_COLUMN)
。
varchar(max)
MySql と同じ量のストレージを取得するには、BLOB
列タイプに頼る必要があります。 この記事では、MySqlに大量のデータを効率的に格納する非常に効果的な方法について説明します。
varchar(max)
、本当に手段を。
varcharの最大長は
65535
列が設定されている文字セットの文字の最大バイト長で除算されます(たとえば、utf8 = 3バイト、ucs2 = 2、latin1 = 1)。
長さを格納するためのマイナス2バイト
他のすべての列の長さを引いたもの
null許容の8列ごとにマイナス1バイト。列がnull / nullでない場合、これはnullマスクと呼ばれるバイト/バイトの1ビットとして、null可能な列ごとに1ビットとして格納されます。
テーブルの変更prg_ar_report_colors add Text_Color_Code VARCHAR(max);
テーブルの変更prg_ar_report_colors add Text_Color_Code longtext;
alter table prg_ar_report_colors add Text_Color_Code CLOB;
制限サイズを下回っているときにMysqlがVARCHARからTEXTに列を変換しています!!!
mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------+
| Note | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)
mysql>