当我尝试在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 phpmyadmin 中导入 sql 时出错

使用 xampp 在 phpmyadmin 中导入批量数据库

在 phpMyAdmin 中导入带有多边形数据的 CSV

如何在 phpmyadmin 中导入 5 GB MySQL Dump 文件

如何在 phpmyadmin MySql 中导入记事本 .txt 文件

在 Wamp Server 中导入数据库