когда я пытаюсь импортировать файл sql в c панели phpmyadmin - указанный ключ слишком длинный;максимальная длина ключа 767 байт # 1071 - PullRequest
0 голосов
/ 28 сентября 2019

есть некоторые похожие вопросы, но не то, что я точно хочу.Как я могу увеличить этот лимит.что такое место назначения файла, где я могу заменить это число (767 байт) другим.

-- Dumping structure for table jofr.categories
CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) unsigned DEFAULT NULL,
  `order` int(11) NOT NULL DEFAULT '1',
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `categories_slug_unique` (`slug`),
  KEY `categories_parent_id_foreign` (`parent_id`),
  CONSTRAINT `categories_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
MySQL said: Documentation

#1071 - Specified key was too long; max key length is 767 bytes

Ответы [ 3 ]

0 голосов
/ 28 сентября 2019

Чтение это .

Отредактируйте файл AppServiceProvider.php и в методе загрузки задайте длину строки по умолчанию:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
0 голосов
/ 28 сентября 2019

Это ограничение MySQL InnoDB, а не PHP.Вы можете обойти ограничение только с помощью кода или потенциально увеличить предел с помощью параметра базы данных.

Проблема связана с вашим индексом на slug.slug определяется как 255 символов, и вы используете utf8mb4, который использует 4 байта на символ, поэтому для индекса slug потребуется 1020 байтов.

Существует несколько вариантов обхода.

1.Уменьшите размер вашего поля.

Вместо того, чтобы вводить slug 255 символов, сделайте его 191. 191 * 4 = 764 <767. Это можно сделать, указав длину поля в своей миграции илине указав длину и настройку <code>\Illuminate\Support\Facades\Schema::defaultStringLength(191);, как указано другими.

2.Уменьшите размер вашего индекса.

Вы можете оставить размер своего поля равным 255, но скажите MySQL индексировать только первые 191 символ.Я не знаю, поддерживают ли миграции Laravel это, но вы всегда можете попробовать.

$table->index('slug(191)');

3.Включите параметр базы данных innodb_large_prefix с форматами строк DYNAMIC.

Параметр базы данных innodb_large_prefix увеличивает ограничение длины ключа до 3072 байтов.Однако этот параметр влияет только на таблицы с форматом строки DYNAMIC или COMPRESSED.

Если вы используете MySQL> = 5.7.7, опция innodb_large_prefix включена по умолчанию.

Если вы используете MySQL> = 5.7.9, формат строки по умолчанию - DYNAMIC, а опция innodb_large_prefix включена по умолчанию, поэтому у вас не возникнет этой проблемы, если вы не измените настройки по умолчанию.

Если вы используете MySQL <5.7.9, по умолчанию используется формат строки COMPACT, поэтому вам нужно будет выяснить, как указать Laravel использовать формат строки DYNAMIC.Если вы хотите сделать это для всех таблиц, вы можете установить <code>'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', в вашей конфигурации базы данных.Если вы хотите сделать это только для одной таблицы, вам нужно запустить необработанные операторы DB create в вашем файле миграции.

Ссылки:
MySQL создать документацию индекса - информация оразмер ключа, форматы строк и частичные индексы
MySQL опция innodb_large_prefix
MySQL опция innodb_default_row_format

0 голосов
/ 28 сентября 2019

Вы можете установить длину строки по умолчанию внутри AppServiceProvider.php файла

app / Providers / AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

public function boot() 
{
    Schema::defaultStringLength(191); 
}

Для получения дополнительной информации вы можете сослаться на аналогичный вопрос, заданный в Stackoverflow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...