Как исправить MySql: размер столбца слишком большой (Laravel migrate)
Я продублировал проект с помощью бродячего бокса, который устанавливает Debian, Nginx, PhpMyAdmin,.. С новым проектом Laravel php artisan migrate
больше не работает, и я получаю сообщение об ошибке:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes. (SQL: alter table `courses` add unique `courses_name_unique`(`na
me`))
Когда я создаю дамп (структуру + данные) рабочей базы данных проекта и импортирую его в базу данных, давая ошибки при переносе, тогда все в порядке и создает все таблицы и данные импортируются..
Как я могу исправить размер, чтобы запустить метод переноса?
Ответы
Ответ 1
Как вы можете видеть в сообщении об ошибке - "Максимальный размер столбца - 767 байт", если вы хотите создать на нем индекс. Столбец VARCHAR(255)
может принимать до 765 (255 * 3) байтов с использованием utf8
и 1020 (255 * 4) байтов с помощью utf8mb4
. Это связано с тем, что в MySQL utf8
занимает до 3 байтов и utf8mb4
до 4 байтов (реальный UTF8). Таким образом, создание индекса VARCHAR(255)
(уникальный) с помощью utf8mb4
завершится с ошибкой.
Это ваши варианты устранения проблемы:
Установите настройку по умолчанию в my.ini
:
collation_server=utf8_unicode_ci
character_set_server=utf8
Задайте настройку по умолчанию для базы данных при создании:
CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'
Установите настройку по умолчанию для таблицы/столбца. (Я не рекомендую это делать)
Измените размер столбца на 190 (varchar(190)
) или меньше.
Laravel 5.4 fix
Конфигурация сервера Mysql перезаписывается командой миграции Laravel. Он установит конфигурацию и кодировку в конфигурационную версию.
Измените поля charset
и collation
движка db в файле конфигурации базы данных, расположенном в config/database.php
.
..
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
//'charset' => 'utf8mb4',
//'collation' => 'utf8mb4_unicode_ci',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
..
Ответ 2
Три решения, каждый из которых имеет недостаток:
-
MySQL 5.7 избегает проблемы. Рассмотрите возможность обновления.
-
VARCHAR(255)
обычно больше, чем необходимо. Если вы можете безопасно уменьшить до 191 или меньше, ошибка исчезнет.
-
Переключитесь на utf8 (из utf8mb4), если вам не нужен китайский или Emoji.
Ответ 3
По умолчанию MySQL использует набор символов utf8, что означает, что мы используем 3 байта для каждого 1 символа. Это означает, что тип столбца varchar (10) использует 30 байт, в результате чего максимальный размер префикса для формата компактных строк эквивалентен varchar (255). Это 255 * 3 байта = 765 байт, что на два байта меньше максимального 767 байт.
Если innodb_large_prefix установлен в on и использует формат строки COMPRESSED или DYNAMIC, вы можете увеличить максимальный размер префикса до 65536 байт вместо 767 байт. На приведенной ниже диаграмме показана максимальная длина символа с большим префиксом InnoDB и [COMPRESSED | DYNAMIC]. Эти значения, ожидаемые для utf8mb4, выше, чем максимальный размер строки таблицы, поэтому нет возможности использовать эти ограничения
Дополнительная информация здесь https://discuss.pivotal.io/hc/en-us/articles/115004086747-Apps-are-down-due-to-the-Maximum-Column-Size-is-767-bytes-Constraint-in -MySQL
Ответ 4
Для mariadb обновите файл *my.cnf
со следующей конфигурацией,
innodb_default_row_format = dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true
Затем вам необходимо перезапустить службу mariadb
чтобы обновленная конфигурация mariadb
в силу.
Ответ 5
Также была проблема, которую я только что сделал, была возвращена с utf8mb4_unicode_ci в utf8_unicode_ci в db-соединении script
Ответ 6
Он работает с 5.5.52-MariaDB.
Установите для всех кодировок значение utf8_general_ci
(сервер, база данных, соединение).