8

私はmysql dbを持っています。私はinnodbを使用しています。私のテーブルの 0 つには、10 を少し超える列が含まれています。最後の列のタイプは LONGTEXT で、html コードが含まれているはずです。問題は、レコードごとに、そのフィールドに完全なコードが含まれておらず、常に同じ量の文字の後に停止することです。挿入しようとしている html ファイルの重量は約 60KO です。したがって、各レコードが mysql の行サイズ制限 (66KO) を超えていると思います。私が知りたいのは、その制限を拡張する方法があるかどうかです。任意の回避策をいただければ幸いです。入力していただきありがとうございます。乾杯。マルク

4

5 に答える 5

18

受け入れられた答えは間違っています (または少なくともかなり独断的です) - バックアップ手順とトランザクションクエリに関して複雑になるため、個人的にはデータベースの外部にデータを保存したくありません。

他の人が指摘しているように、マニュアルには BLOB 列と TEXT 列は合計行サイズにカウントされないと繰り返し記載されていますが、残念ながら、デフォルトの構成設定ではそうではなく、このエラーメッセージが表示されます。(エラーメッセージは意味がありません.VARCHARの代わりにTEXTを使用して問題に対処するように指示しているためです-あなたはすでにそうです。)

この制限の理由は、行の可変長列の最初の 768 バイトを格納するデフォルトのストレージ メカニズムであるAntelopeです。考えられる解決策は、INNODB を使用し、ストレージ メカニズムを別のBarracudaストレージ メカニズムに切り替えることです。

SET GLOBAL innodb_file_format=Barracuda;

この設定は新しいデータベース ファイルのデフォルトであるため、すぐには効果がありません。そのため、データベース全体を削除して再作成する必要があります。

または、(上記のように) Barracuda に切り替えてから、(さらに) file-per-table 戦略に切り替えます。

SET GLOBAL innodb_file_per_table=ON;

繰り返しますが、これはすぐには効果がありません。どちらの設定も新しいテーブルのデフォルトであるためです。この場合も、テーブルを削除して再作成する必要があります。

これを行った後に MySQL データ フォルダを調べると、「data」という名前のデータベースと「test」という名前のテーブルなど、別々のファイルが作成されていることを確認できます。「data/test/bigtable」という名前のファイルが表示されます。 .ibd".

MySQL のグローバル設定を変更したくない場合は、ステートメントを実行する直前など、SET SESSION代わりに試してください。SET GLOBALCREATE TABLE

于 2013-07-09T21:05:46.010 に答える
7

(LONG)TEXT (および BLOB) の値は、「行内」に格納されるのではなく、その外側に格納されます。したがって、HTML のサイズは個々の行のサイズには影響しません。

マニュアルから:

ストレージ エンジンがより大きな行をサポートできる場合でも、テーブルの内部表現の最大行サイズは 65,535 バイトです。この数値には、このサイズに 9 ~ 12 バイトしか寄与しない BLOB または TEXT 列は含まれません。

BLOB および TEXT データの場合、情報は行バッファーとは異なるメモリ領域に内部的に格納されます。

(私のものを強調)

http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html

于 2012-04-27T11:07:11.763 に答える
2
于 2012-04-27T11:01:39.573 に答える
0

この制限はストレージ エンジンには依存しないため、拡張する方法はありませんが、サーバーのハード リミットです。

すべてのテーブル (ストレージ エンジンに関係なく) の最大行サイズは 65,535 バイトです。ストレージ エンジンは、この制限に追加の制約を課し、有効な最大行サイズを減らす場合があります。

この場合、解決策は、HTML の保存を別の場所 (ファイルシステムまたはクラウド (S3)) に延期し、表の列のファイル名を参照することを中心に展開する必要があります。

于 2012-04-27T11:04:40.403 に答える
0

以下の手順で解決しました。

ステップ 1: 以下のクエリを MySql に実行して、グローバル変数を設定します。

  • SET GLOBAL innodb_file_format=バラクーダ;
  • SET GLOBAL innodb_file_per_table=ON;

ステップ-2: 大きなデータを単一の行に保存しようとしたときにエラーが発生するテーブルを選択します。

ステップ-3: オペレーションに移動

Step-4: ROW_FORMAT から COMPRESSED を選択します。(デフォルトでは、COMPRESSED や DYNAMIC などの別のオプションを見つけることができるグローバル変数 innodb_file_format および innodb_file_per_table を設定すると、COMPACT および REDUNDANT が存在します)

ステップ-5: [実行] をクリックします。

:)

于 2013-11-29T05:51:24.873 に答える