MySQLのvarchar(max)と同等ですか?


回答:


195

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)

20
TEXTの使用もお勧めします
Adi

2
@AdnanShammout:もちろん、DEFAULT列の値を宣言したい場合を除きます。TEXT型やBLOB型ではできません。
Bill Karwin

5
@DanW、TEXT長さ制限は64Kです。 MEDIUMTEXT長さの制限は16Mです。 LONGTEXT長さ制限は4Gです。
ビルカーウィン2013年

4
これに関する最大の問題は、そのサイズの列を作成した場合、テーブルにその列を1つしか持てないことです。MySql の最大行サイズは64kであるため、64k列がある場合はそれで十分です。これと同じ制約は、SQL Serverのvarchar(max)列タイプには適用されません。
joshperry 2013

1
@joshperry、はい。ただし、TEXT / BLOB列は、64KBの行サイズ制限に対してわずかな量(9〜12バイト)しかカウントしないため、大きなVARCHARと他のいくつかの列が必要な場合は、TEXTを使用することをお勧めします。
ビルカーウィン

74

TLDR; MySqlには同等の概念がありませんvarchar(max)。これはMS SQL Serverの機能です。

VARCHAR(max)とは何ですか?

varchar(max) Microsoft SQL Serverの機能です。

バージョン2005より前のバージョンのMicrosoft SQL Serverで列に格納できるデータの量は8KBに制限されていました。以上8キロバイト以上保管するためには、使用する必要がありますTEXTNTEXTまたはBLOB、8Kページの集合としてのデータを格納し、これらの列の型は、テーブルのデータ・ページとは別の列タイプを。1行あたり最大2GBの保存をサポートしました。

これらの列型に大きな注意点は、彼らは通常、(例えばアクセスに特別な機能や文を必要とし、データを変更することだったREADTEXTWRITETEXTUPDATETEXT

SQL Server 2005ではvarchar(max)、大きな列のデータの取得と変更に使用されるデータとクエリを統合するために導入されました。varchar(max)列のデータは、テーブルデータページとインラインで格納されます。

MAX列のデータが8KBのデータページを満たすと、オーバーフローページが割り当てられ、前のページがそれをポイントしてリンクリストを形成します。異なりTEXTNTEXT、および列タイプは、他の列の型と同じクエリのセマンティクスは、すべてのサポートされています。BLOBvarchar(max)

だからvarchar(MAX)本当に意味しvarchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)、ではないvarchar(MAX_SIZE_OF_A_COLUMN)

MySqlには同等のイディオムがありません。

varchar(max)MySql と同じ量のストレージを取得するには、BLOB列タイプに頼る必要があります。 この記事では、MySqlに大量のデータを効率的に格納する非常に効果的な方法について説明します。


1
これは、MySQLよりもSQL Serverに関係しています。
カーミット2013

14
はい@njkが、MySQLで「同等」(または、この場合の等価性の欠如)が正確に何を記述する必要かを説明するためにvarchar(max) 、本当に手段を。
joshperry 2013

29

varcharの最大長は

65535

列が設定されている文字セットの文字の最大バイト長で除算されます(たとえば、utf8 = 3バイト、ucs2 = 2、latin1 = 1)。

長さを格納するためのマイナス2バイト

他のすべての列の長さを引いたもの

null許容の8列ごとにマイナス1バイト。列がnull / nullでない場合、これはnullマスクと呼ばれるバイト/バイトの1ビットとして、null可能な列ごとに1ビットとして格納されます。


私はあなたの回答の形式が好きですが、文字セットなどに関してトップアンサーが提供するいくつかの有用な情報が欠けているようです
Joe Phillips

3

SQL Serverの場合

テーブルの変更prg_ar_report_colors add Text_Color_Code VARCHAR(max);

MySqlの場合

テーブルの変更prg_ar_report_colors add Text_Color_Code longtext;

Oracleの場合

alter table prg_ar_report_colors add Text_Color_Code CLOB;


1
ロングテキスト、テキスト、ブロブはvarcharとは異なる方法で格納されることに注意してください。varcharは他のフィールドとともに保存され、テキストはサーバーの別のファイルに保存されます。それは長所と短所を持っているのでどちらを選択するかは非常に慎重です
サンティアゴアリスティ

0

制限サイズを下回っているときに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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.