Ошибка MySQL: максимальный размер столбца составляет 767 байт

Когда я запускаю программу, которая что-то делает с 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 или нет.

В любом случае, есть ли у кого-нибудь идея, как решить эту проблему?

Ответ 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;

Ответ 2

Ваша колонка, которую вы пытаетесь индексировать, слишком велика, и ваши настройки не должны быть правильными для 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) по умолчанию.

Ответ 3

У меня была такая же ошибка, несмотря на правильную настройку 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 байт

Ответ 4

В моем случае (MySQL версии 5.6) проблема заключалась в том, что я пытался создать таблицу с столбцом, который может содержать до 256 символов (db использует сортировку utf8), поэтому 3 байта на 1 символ utf8 = 256 * 3 = 768 байт. Исправить было просто 255 символов вместо 256.

Я мог бы также установить innodb_large_prefix, как и другие, но в моем случае было проще иметь меньше символов.

Ответ 5

У меня была эта проблема, потому что я попытался создать первичный ключ String с varchar (254). Легко упускать иногда. Так что дважды проверьте свой тип индекса и длину :)

Ответ 6

Я использовал 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'

источник:https://www.experts-exchange.com/questions/28675824/Why-am-I-unable-to-turn-innodb-large-prefix-ON-successfully-Every-time-I-reboot-mySql-on-my-Ubuntu-VPS-it-resets-to-OFF.html

Ответ 7

Просто добавьте следующие параметры в my.cnf

[mysqld]
innodb_file_format=Barracuda
innodb_file_per_table=1
innodb_large_prefix=1

Затем, перезапустите сервер MySQL, проблема будет решена.

Ответ 8

Задайте следующие системные переменные:

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. Вот что, наконец, исправило меня.

Ответ 9

У меня была такая же ошибка, но по другой проблеме. Я получил эту ошибку при импорте данных (данных и схемы) script. Удаление уникального индекса устранило проблему для меня.

Ответ от этой ссылки