MySQLで何かを行うプログラムを実行すると、次のエラーメッセージが表示されます。
2015-06-10 15:41:12,250エラーapp.wsutils 419 INCRON:エラー:( 'HY000'、 '[HY000] [MySQL] [ODBC 5.2(w)Driver] [mysqld-5.7.7-rc-log]インデックス列のサイズが大きすぎます。最大列サイズは767バイトです(1709)(SQLExecDirectW) ')
少しGoogleで調べたところ、このエラーはinnodb_large_prefix
オプションに関連している可能性があります。ただし、MySQL 5.7.7 rcを使用しています。これは、innodb_large_prefix
を既に「ON」に設定し(MySQL Workbenchでチェック)、最大3072バイトを許可しています。それがinnodb_large_prefix
の問題なのかどうかはわかりません。
とにかく、誰もこの問題を修正する方法を知っていますか?
BK435の回答を参考にして、次のことを行い、問題を解決しました。
set global innodb_file_format = BARRACUDA;
set global innodb_large_prefix = ON;
create table test (........) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
インデックスを作成しようとしている列が大きすぎるため、innodb_large_prefix
。いくつかの 前提条件 パラメーターがあり、innodb_large_prefix
正常に動作します。
次のコマンドを実行して、 innodb_large_prefix が設定されていることを確認できます。
show global variables like 'innodb_lar%';
Innodb_large_prefixを使用するためのいくつかの前提条件は次のとおりです。
グローバル変数innodb_file_format = [〜#〜] barracuda [〜#〜] を設定する必要があります
設定の実行を確認するには:show global variables like 'innodb_fil%';
テーブルレベルでは、ROW_FORMAT = DYNAMICまたはROW_FORMAT = COMPRESSEDを使用する必要があります
Innodb の場合、行はデフォルトでCOMPACT形式(ROW_FORMAT = COMPACT)で保存されます。
_innodb_large_prefix
_が正しく設定されていても、同じエラーが発生しました。
問題は、使用された照合にありました。私のデータベースには、デフォルトの照合が_utf8mb4_bin
_に設定されていました(データベースのphpmyadmin [操作]タブで確認できます)。つまり、1文字あたり4バイトを使用し、utf8照合(例:utf8_unicode_ci)は1文字あたり3バイトを使用します。
この場合、異なる照合を使用できます。 _DEFAULT CHARSET=utf8
_ステートメントの最後に_CREATE TABLE
_を追加するか、KEY 'identifier' (column1(5),column2(10))
などの列値の一部のみを使用してインデックスサイズを制限します。
関連する質問も参照してください: #1071-指定されたキーが長すぎました;キーの最大長は767バイトです
MariaDBバージョン10.1.38を使用し、以下のコマンドをすべて使用しましたが、機能しませんでした-
set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)
set global innodb_file_per_table = ON;
Query OK, 0 rows affected (0.00 sec)
set global innodb_file_format = Barracuda;
Query OK, 0 rows affected (0.00 sec)
SET GLOBAL innodb_default_row_format = 'DYNAMIC';
MySQL(またはMariaDB)を再起動した後、これらの設定はmysqlプロンプトでコマンドを使用して反映されないため: 'innodb%'などの変数を表示します。
次に、My.iniを編集し、これらの設定を以下の場所のファイルに追加しました-C:\ xampp\mysql\bin\my.ini
## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'
Varchar(254)でString主キーを作成しようとしたため、この問題が発生しました。時々見落としがちです。ですから、インデックスのタイプと長さも再確認してください:)
私の場合(MySQLバージョン5.6)、問題は最大256文字(dbはutf8照合順序を使用)を持つ列を持つテーブルを作成しようとしていたため、1 utf8文字あたり3バイト= 256 * 3 = 768バイト。修正は、256文字ではなく255文字にすることでした。
他の人が示唆するようにinnodb_large_prefixを設定することもできますが、私の場合はシンボルを少なくする方が簡単でした。