Ответ 1
С помощью ответа, данного BK435, я сделал следующее и решил проблему.
set global innodb_file_format = BARRACUDA;
set global innodb_large_prefix = ON;
create table test (........) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
Когда я запускаю программу, которая что-то делает с MySQL, я получил это сообщение об ошибке:
2015-06-10 15: 41:12,250 ОШИБКА app.wsutils 419 INCRON: Ошибка: ('HY000', '[HY000] [MySQL] [ODBC 5.2 (w) Драйвер] [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
.
Проблема заключалась в использовании сортировки. У моего db была установлена сортировка по умолчанию utf8mb4_bin
(вы можете проверить ее на вкладке "Операции" phpmyadmin для базы данных). Это означает, что он использует 4 байта на char, в то время как сортировка utf8 (например, utf8_unicode_ci) использует 3 байта за char.
в этом случае вы можете использовать другую сортировку, например. добавив DEFAULT CHARSET=utf8
в конец оператора CREATE TABLE
или ограничив размер индекса, используя только часть значения столбца
например KEY 'identifier' (column1(5),column2(10))
.
См. также соответствующий вопрос: # 1071 - Указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт
В моем случае (MySQL версии 5.6) проблема заключалась в том, что я пытался создать таблицу с столбцом, который может содержать до 256 символов (db использует сортировку utf8), поэтому 3 байта на 1 символ utf8 = 256 * 3 = 768 байт. Исправить было просто 255 символов вместо 256.
Я мог бы также установить innodb_large_prefix, как и другие, но в моем случае было проще иметь меньше символов.
У меня была эта проблема, потому что я попытался создать первичный ключ String с varchar (254). Легко упускать иногда. Так что дважды проверьте свой тип индекса и длину :)
Я использовал 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 и добавил эти настройки в файл ниже location- 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'
Просто добавьте следующие параметры в my.cnf
[mysqld]
innodb_file_format=Barracuda
innodb_file_per_table=1
innodb_large_prefix=1
Затем, перезапустите сервер MySQL, проблема будет решена.
Задайте следующие системные переменные:
innodb_buffer_pool_size.................................... 702545920
innodb_file_format......................................... Barracuda
innodb_file_format_check................................... ON
innodb_file_format_max..................................... Barracuda
innodb_file_per_table...................................... ON
innodb_large_prefix........................................ ON
innodb_log_file_size....................................... 50331648
Кроме того, убедитесь, что при создании вашей схемы вы создаете ее как Latin1. Вот что, наконец, исправило меня.
У меня была такая же ошибка, но по другой проблеме. Я получил эту ошибку при импорте данных (данных и схемы) script. Удаление уникального индекса устранило проблему для меня.
Ответ от этой ссылки