Как исправить 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 (сервер, база данных, соединение).