Как dum-dum, я не мог понять, почему ни один из этих ответов не работал на мои файлы Kotlin для java.util.*
, поэтому, если это происходит с вами, тогда:
Preferences
> Editor
> Code Style
> **Kotlin**
> Imports
> Packages to Use Import with '*'
-> Remove 'java.util.*'
767 байтов - это заявленное ограничение префикса для таблиц InnoDB в MySQL версии 5.6 (и предыдущих версиях). Для таблиц MyISAM это 1000 байт. В MySQL версии 5.7 и выше этот предел был увеличен до 3072 байтов.
Вы также должны знать, что если вы устанавливаете индекс для большого поля char или varchar, которое закодировано в utf8mb4, вы должны разделить префикс максимального индекса длина 767 байтов (или 3072 байта) на 4, что дает 191. Это связано с тем, что максимальная длина символа utf8mb4 составляет четыре байта. Для символа utf8 это будет три байта, что даст максимальную длину префикса индекса 254.
Один из вариантов, который у вас есть, - просто установить нижний предел для ваших полей VARCHAR.
В моем случае у меня была эта проблема, когда я делал резервные копии базы данных, используя символы ввода / вывода перенаправления 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» байты "просто исчезли".
Когда вы достигнете предела. Установите следующее.
utf8
VARCHAR(255)
utf8mb4
VARCHAR(191)
выполните этот запрос перед вашим запросом:
SET @@global.innodb_large_prefix = 1;
это увеличит ограничение до 3072 bytes
.
Вы можете добавить столбец md5 длинных столбцов
.Вот мой оригинальный ответ:
[119 Однако, это не работает для всех случаев.Я просто удаляю базу данных и воссоздаю вот так, и ошибка исчезла:
drop database if exists rhodes; create database rhodes default CHARACTER set utf8 default COLLATE utf8_general_ci;
На самом деле проблема заключается в использовании индексов для столбцов VARCHAR с набором символов utf8
(или utf8mb4
) со столбцами VARCHAR, длина которых превышает определенную длину символов. В случае utf8mb4
эта определенная длина равна 191.
Обратитесь к разделу «Длинные индексы» в этой статье для получения дополнительной информации о том, как использовать длинные индексы в базе данных MySQL: http://hanoian.com/content/index.php/24-automate-the-converting- a-mysql-database-символ-набор-к-utf8mb4
5 Обходных решений
Эта проблема существует в том, прежде чем предел был повышен в 5.7.7 (MariaDB 10.2.2?).
, Если Вы поражаете предел из-за попытки использовать CHARACTER SET utf8mb4
. Тогда сделайте одно из следующих (у каждого есть недостаток) для предотвращения ошибки:
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)
Какую кодировку символов вы используете? Некоторые наборы символов (например, UTF-16 и т. Д.) Используют более одного байта на символ.