当我尝试在 C 面板 phpmyadmin 中导入 sql 文件时 - 指定的密钥太长;最大密钥长度为 767 字节 #1071
Posted
技术标签:
【中文标题】当我尝试在 C 面板 phpmyadmin 中导入 sql 文件时 - 指定的密钥太长;最大密钥长度为 767 字节 #1071【英文标题】:when i try to import sql file in c panel phpmyadmin - Specified key was too long; max key length is 767 bytes #1071 【发布时间】:2020-01-28 13:27:45 【问题描述】:有一些类似的问题,但不是我真正想要的。 我怎样才能增加这个限制。什么是文件目标,我可以在哪里用另一个替换这个数字(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
【问题讨论】:
Laravel Migration Error: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes的可能重复 【参考方案1】:您可以在 AppServiceProvider.php 文件中设置默认字符串长度
app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Schema;
public function boot()
Schema::defaultStringLength(191);
更多信息可以参考a similar question asked in ***
【讨论】:
没有别的办法/【参考方案2】:阅读this。
编辑您的 AppServiceProvider.php 文件并在启动方法中设置一个 默认字符串长度:
use Illuminate\Support\Facades\Schema;
public function boot()
Schema::defaultStringLength(191);
【讨论】:
我知道这一点,但我想要不迁移【参考方案3】:这是 MySQL InnoDB 限制,而不是 PHP 限制。您只能使用代码解决限制,或者您可以使用数据库选项潜在地增加限制。
问题在于您在slug
上的索引。 slug
定义为 255 个字符,并且您使用的是 utf8mb4,每个字符使用 4 个字节,因此您在 slug
上的索引需要 1020 个字节。
有几个解决方法。
1。减小字段的大小。
不要将 slug
设为 255 个字符,而是将其设为 191。191 * 4 = 764 \Illuminate\Support\Facades\Schema::defaultStringLength(191); 设置为别人提到的。
2。减小索引的大小。
您可以将字段大小保持在 255,但告诉 MySQL 仅索引前 191 个字符。我不知道 Laravel 迁移是否支持这一点,但你可以随时尝试。
$table->index('slug(191)');
3。使用 DYNAMIC 行格式启用 innodb_large_prefix
数据库选项。
innodb_large_prefix
数据库选项将密钥长度限制增加到 3072 字节。但是,此选项仅影响行格式为 DYNAMIC 或 COMPRESSED 的表。
如果您使用的是 MySQL >= 5.7.7,则默认启用 innodb_large_prefix
选项。
如果您使用的是 MySQL >= 5.7.9,则默认行格式为 DYNAMIC,并且默认启用 innodb_large_prefix
选项,因此您不会遇到此问题,除非您更改了默认值.
如果你在 MySQL 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',。如果您只想对一张表执行此操作,则需要在迁移文件中运行原始 DB 创建语句。
参考:MySQL create index documentation - 有关密钥大小、行格式和部分索引的信息MySQL innodb_large_prefix optionMySQL innodb_default_row_format option
【讨论】:
【参考方案4】:问题在于长度大于 191 的唯一列
`slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
在这一行中,将 varchar(255) 替换为 varchar(191) 即可解决
【讨论】:
以上是关于当我尝试在 C 面板 phpmyadmin 中导入 sql 文件时 - 指定的密钥太长;最大密钥长度为 767 字节 #1071的主要内容,如果未能解决你的问题,请参考以下文章
使用 xampp 在 phpmyadmin 中导入批量数据库
如何在 phpmyadmin 中导入 5 GB MySQL Dump 文件