web-dev-qa-db-ja.com

エラー1118:行サイズが大きすぎます。 utf8 innodb

私は解決策の人を見つけようとしました、そして私は誰かが以前にこれに会ったことを推測しています。しかし、ヒット数を5000未満に下げることはできません...そのほとんどは私の質問と一致しません。

MySQL 5.6の使用-ウィンドウ(XPとWin7の両方-同じ問題)

私は次の構造を持つutf8 mysqlスキーマを持っています(フィールド名は削除されています)スキーマは標準ツールだけを使用して構築されました-圧縮も何も選択しませんでした。

f1  varchar(5) 
f2  varchar(255)
f3  varchar(255)
f4  varchar(255)
f5  varchar(255)
f6  datetime
f7  datetime
f8  longtext
f9  varchar(255)
f10 varchar(255)
f11 longtext
f12 varchar(255)
f13 varchar(255)
f14 varchar(255)
f15 longtext
f16 longtext
f17 longtext
f18 longtext
f19 longtext
f20 longtext
f21 longtext
f22 longtext
f23 varchar(255)
f24 varchar(255)
f25 varchar(255)
f26 longtext
f27 longtext
f28 varchar(255)
f29 varchar(255)
f30 longtext
f31 longtext
f32 longtext
f33 longtext
f34 longtext
f35 longtext
f36 longtext
f37 longtext
f38 longtext
f39 datetime
f40 datetime

これは、長いテキストフィールドの多くに大量のテキストが含まれるレコードに到達するまで、問題なく機能します。たとえば、6つの長いテキストフィールドに値を挿入したが、7番目に(たとえば)値を貼り付けようとすると、1118エラーが発生します。

このデータは行の外に格納されるため、行の長さに影響しないテキストフィールドに入力されるので、少し戸惑いました(エントリの定義に使用される12バイトを除く)。上記の構造の行の長さを推測すると、64Kの制限内である11009バイト(ギブまたはテイク)になります。

これがなぜ失敗するのか本当に理解できないので、これは苛立たしいことです。テーブルを複数の1対1に分割することもできましたが、それはやりがいのあるようで、テキストフィールドを取り出して、外部キーと変数名および関連するテキストを含む関連テーブルを作成できます(この要素の行モデリングを使用) -しかし、再び、それは後で私の背中のための単なるロッドです。

3
Paul Snell

あなたが見る必要がある2つの問題があります

問題#1:文字とバイト

UTF-8は文字ごとに3バイトを使用するため、文字フィールドに十分に割り当てられていない可能性があります。

問題#2: InnoDB行の長さ

デフォルトでは、単一列インデックスのインデックスキーは最大767バイトです。同じ長さ制限が、すべてのインデックスキープレフィックスに適用されます。セクション13.1.13「CREATE INDEX構文」を参照してください。たとえば、UTF-8文字セットと各文字の最大3バイトを想定して、TEXTまたはVARCHAR列の列プレフィックスインデックスが255文字を超えると、この制限に達する可能性があります。 innodb_large_prefix構成オプションが有効になっている場合、DYNAMICおよびCOMPRESSED行形式を使用するInnoDBテーブルの場合、この長さ制限は3072バイトに引き上げられます。

許可されているよりも長いインデックスプレフィックス長を指定しようとすると、長さは暗黙的に最大長に短縮されます。この構成オプションは、許可される最大長よりも長い行フォーマットとプレフィックス長の一部の組み合わせのエラー処理を変更します。詳細については、innodb_large_prefixを参照してください。

InnoDB内部の最大キー長は3500バイトですが、MySQL自体はこれを3072バイトに制限しています。この制限は、複数列インデックスの結合インデックスキーの長さに適用されます。

可変長列(VARBINARY、VARCHAR、BLOB、およびTEXT)を除く最大行長は、データベースページの半分よりわずかに短いです。つまり、行の最大長は約8000バイトです。 LONGBLOB列とLONGTEXT列は4GB未満である必要があり、BLOB列とTEXT列を含む行の全長は4GB未満である必要があります。

行の長さがページの半分に満たない場合、そのすべてがページ内のローカルに保存されます。 14.3.12.2項「ファイルスペース管理」で説明されているように、ページの半分を超える場合、行がページの半分に収まるまで、可変長列が外部のオフページストレージとして選択されます。

InnoDBは内部的に65,535バイトより大きい行サイズをサポートしていますが、MySQL自体はすべての列の合計サイズに対して65,535の行サイズ制限を課しています。

mysql> CREATE TABLE t(a VARCHAR(8000)、b VARCHAR(10000)、-> c VARCHAR(10000)、d VARCHAR(10000)、e VARCHAR(10000)、-> f VARCHAR(10000)、g VARCHAR(10000 ))ENGINE = InnoDB;エラー1118(42000):行サイズが大きすぎます。使用されるテーブルタイプの最大行サイズは、BLOBをカウントせずに65535です。一部の列をTEXTまたはBLOBに変更する必要があります。セクションE.10.4「テーブルの列数と行サイズの制限」を参照してください。

2
RolandoMySQLDBA