web-dev-qa-db-ja.com

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

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

159
David Basarab

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)
179
Bill Karwin

VARCHAR(max)とは何ですか?

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

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

これらの列タイプの大きな注意点は、通常、データにアクセスして変更するために特別な関数とステートメントが必要なことです(例:READTEXTWRITETEXT、およびUPDATETEXT

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

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

したがって、varchar(MAX)は実際にはvarchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)ではなくvarchar(MAX_SIZE_OF_A_COLUMN)を意味します。

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

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

72
joshperry

Varcharの最大長は

65535

列が設定されている文字セットの文字の最大バイト長で割った値(例:utf8 = 3バイト、ucs2 = 2、latin1 = 1)。

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

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

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

27
ʞɔıu

SQL Serverの場合

alter table prg_ar_report_colors add Text_Color_Code VARCHAR(max);

MySqlの場合

alter prg_ar_report_colors add Text_Color_Code longtext;

Oracleの場合

alter table prg_ar_report_colors add Text_Color_Code CLOB;

3
Dinanath Parit

制限サイズ未満の場合、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>
0
zloctb