Laravel 当我尝试在c面板中导入sql文件时,phpmyadmin指定的键太长;最大密钥长度为767字节1071

Laravel 当我尝试在c面板中导入sql文件时,phpmyadmin指定的键太长;最大密钥长度为767字节1071,laravel,phpmyadmin,Laravel,Phpmyadmin,有一些类似的问题,但不是我真正想要的。 我怎样才能提高这个限额呢。文件目的地是什么?我可以在哪里用另一个字节替换这个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, `

有一些类似的问题,但不是我真正想要的。 我怎样才能提高这个限额呢。文件目的地是什么?我可以在哪里用另一个字节替换这个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

可以在AppServiceProvider.php文件中设置默认字符串长度

app/Providers/AppServiceProvider.php

有关更多信息,请参考阅读

编辑您的AppServiceProvider.php文件,并在引导方法集合中 默认字符串长度:


这是MySQL InnoDB限制,不是PHP限制。只能使用代码绕过限制,也可以使用数据库选项潜在地增加限制

问题在于你对slug的索引。slug定义为255个字符,您使用的是utf8mb4,每个字符使用4个字节,因此slug上的索引需要1020个字节

有两种解决方案

1.减小字段的大小。 不要让你的slug变成255个字符,而是让它变成191个。191 * 4 = 764 < 767. 您可以通过在迁移中指定字段长度,或者不指定长度和设置\illumb\Support\Facades\Schema::defaultStringLength191;正如其他人提到的那样

2.减小索引的大小。 您可以将字段大小保持在255,但告诉MySQL只索引前191个字符。我不知道Laravel迁移是否支持这一点,但您可以随时尝试

$table->index('slug(191)');
3.使用动态行格式启用innodb_large_prefix数据库选项。 innodb_large_prefix数据库选项将密钥长度限制增加到3072字节。但是,此选项仅影响行格式为“动态”或“压缩”的表

如果您使用的是MySQL>=5.7.7,默认情况下会启用innodb_large_前缀选项

如果您使用的是MySQL>=5.7.9,那么默认的行格式是动态的,并且默认情况下启用了innodb_large_prefix选项,因此您不会遇到此问题,除非您更改了默认值

如果您使用的是MySQL<5.7.9,那么默认的行格式是COMPACT,因此您需要了解如何告诉Laravel使用动态行格式。如果要对所有表执行此操作,可以在数据库配置中设置'engine'=>'InnoDB ROW_FORMAT=DYNAMIC'。如果只想对一个表执行此操作,则需要在迁移文件中运行raw DB create语句

参考资料: -有关键大小、行格式和部分索引的信息
问题在于长度大于191的唯一列

`slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,

在这一行中,用varchar191替换varchar255,这将得到解决

我知道这可能是重复的,但我不想迁移,没有其他方法/
$table->index('slug(191)');
`slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,