質問

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

役に立ちましたか?

解決

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)

他のヒント

VARCHAR(max)とは

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

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

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

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

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

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

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

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

varcharの最大長は

です

65535

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

マイナス2バイトで長さを保存

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

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

SQL Serverの場合

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

MySqlの場合

alter table prg_ar_report_colors add Text_Color_Code longtext;

Oracleの場合

変更テーブル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>

MySQL 5.6.12のvarcharの最大長は4294967295です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top