指定的文件名无效或太长,请指定另一个文件名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指定的文件名无效或太长,请指定另一个文件名相关的知识,希望对你有一定的参考价值。

参考技术A 今天删除文件夹的时候,出现不能删除异常,并且报出下面的提示信息

可能是因为我的文件夹层次太深,并且有一些文件夹名称太长导致的,于是我将这个文件往上几级文件夹剪切到一个层次比较浅的目录下之后,再删除就成功了。
比如原来的文件夹层次是(数字仅仅是代号,实际文件夹名称很长的):

然后我大概讲文件夹15剪切到文件夹5,然后再删除已经在文件夹5下面的文件夹13,就成功了。

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

【中文标题】当我尝试在 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) 即可解决

【讨论】:

以上是关于指定的文件名无效或太长,请指定另一个文件名的主要内容,如果未能解决你的问题,请参考以下文章

无法移动、剪切、复制文件 出现指定的文件名无效或太长

“指定的文件名无效或太长” 无法拷贝,咋办

文件名太长 删不了怎么办

文件名过长无法复制怎么解决

Java:找出指定文件夹里的文件名!

文件名过长无法复制怎么解决