# 1071 - Указанный ключ был слишком длинным; максимальная длина ключа 767 байт

Как dum-dum, я не мог понять, почему ни один из этих ответов не работал на мои файлы Kotlin для java.util.*, поэтому, если это происходит с вами, тогда:

Preferences
> Editor
> Code Style
> **Kotlin**
> Imports
> Packages to Use Import with '*'
-> Remove 'java.util.*'
477
задан OMG Ponies 23 May 2011 в 21:32
поделиться

8 ответов

767 байтов - это заявленное ограничение префикса для таблиц InnoDB в MySQL версии 5.6 (и предыдущих версиях). Для таблиц MyISAM это 1000 байт. В MySQL версии 5.7 и выше этот предел был увеличен до 3072 байтов.

Вы также должны знать, что если вы устанавливаете индекс для большого поля char или varchar, которое закодировано в utf8mb4, вы должны разделить префикс максимального индекса длина 767 байтов (или 3072 байта) на 4, что дает 191. Это связано с тем, что максимальная длина символа utf8mb4 составляет четыре байта. Для символа utf8 это будет три байта, что даст максимальную длину префикса индекса 254.

Один из вариантов, который у вас есть, - просто установить нижний предел для ваших полей VARCHAR.

439
ответ дан 22 November 2019 в 22:31
поделиться

В моем случае у меня была эта проблема, когда я делал резервные копии базы данных, используя символы ввода / вывода перенаправления linux. Поэтому я меняю синтаксис, как описано ниже. PS: используя терминал Linux или Mac.

Резервное копирование (без перенаправления>)

# mysqldump -u root -p databasename -r bkp.sql

Восстановление (без перенаправления <)

# mysql -u root -p --default-character-set=utf8 databasename
mysql> SET names 'utf8'
mysql> SOURCE bkp.sql

Ошибка «Указанный ключ был слишком длинным; максимальная длина ключа 767» байты "просто исчезли".

1
ответ дан Cassio Seffrin 23 May 2011 в 21:32
поделиться

Когда вы достигнете предела. Установите следующее.

  • INNODB utf8 VARCHAR(255)
  • INNODB utf8mb4 VARCHAR(191)
285
ответ дан Aley 23 May 2011 в 21:32
поделиться

выполните этот запрос перед вашим запросом:

SET @@global.innodb_large_prefix = 1;

это увеличит ограничение до 3072 bytes.

47
ответ дан Fábio Batista 23 May 2011 в 21:32
поделиться

Вы можете добавить столбец md5 длинных столбцов

.
15
ответ дан diyism 23 May 2011 в 21:32
поделиться

Вот мой оригинальный ответ:

Я просто удаляю базу данных и воссоздаю вот так, и ошибка исчезла:

drop database if exists rhodes; create database rhodes default CHARACTER set utf8 default COLLATE utf8_general_ci;

[119 Однако, это не работает для всех случаев.

На самом деле проблема заключается в использовании индексов для столбцов VARCHAR с набором символов utf8 (или utf8mb4) со столбцами VARCHAR, длина которых превышает определенную длину символов. В случае utf8mb4 эта определенная длина равна 191.

Обратитесь к разделу «Длинные индексы» в этой статье для получения дополнительной информации о том, как использовать длинные индексы в базе данных MySQL: http://hanoian.com/content/index.php/24-automate-the-converting- a-mysql-database-символ-набор-к-utf8mb4

9
ответ дан Châu Hồng Lĩnh 23 May 2011 в 21:32
поделиться

5 Обходных решений

Эта проблема существует в том, прежде чем предел был повышен в 5.7.7 (MariaDB 10.2.2?).

, Если Вы поражаете предел из-за попытки использовать CHARACTER SET utf8mb4. Тогда сделайте одно из следующих (у каждого есть недостаток) для предотвращения ошибки:

  • Обновление 5.7.7 (или позже) для 3 072-байтового предела;
  • Изменение от 255 до 191 на VARCHAR - Вы теряете какие-либо значения дольше, чем 191 символ (вряд ли?);
  • ALTER .. CONVERT TO utf8 - Вы теряете Эмодзи и некоторые китайцы;
  • Использование индекс "префикса" - Вы теряете некоторые выигрыши в производительности.
  • Или... Останьтесь с 5.6/5.5/10.1, но выполните 4 шага для повышения предела 3 072 байтам:

    SET GLOBAL innodb_file_format=Barracuda;
    SET GLOBAL innodb_file_per_table=1;
    SET GLOBAL innodb_large_prefix=1;
    logout & login (to get the global values);
    ALTER TABLE tbl ROW_FORMAT=DYNAMIC;  -- (or COMPRESSED)
    
0
ответ дан Rick James 29 August 2019 в 18:13
поделиться

Какую кодировку символов вы используете? Некоторые наборы символов (например, UTF-16 и т. Д.) Используют более одного байта на символ.

38
ответ дан 22 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: