错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91

Posted

技术标签:

【中文标题】错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91【英文标题】:Error: #1071 - Specified key was too long; max key length is 1000 bytes - mysql 5.0.91 【发布时间】:2012-05-25 10:13:16 【问题描述】:

我使用的是 mysql 5.0.91,我需要保存 URL(有些很小,有些很长)。 我想使用varchar(2000),但出现错误:

#1071 - 指定的密钥太长;最大密钥长度为 1000 字节

使用 mysql 5.0.91 在我的主机上保存 URL 的最佳方法是什么?

【问题讨论】:

TEXT 及其变体最适合这种情况。 看看这些是否有用(总是研究你的错误信息):***.com/… 或***.com/questions/tagged/mysql-error-1071 你有点问两个不同的问题。存储 URL 的最佳方式:***.com/a/219664/398242 错误原因及解决方法:***.com/questions/1814532/… 【参考方案1】:

我运行了那个错误,因为我在 db 中选择了 utf-16 排序规则 - 切换回 utf-8 general-ci - 它消失了。

【讨论】:

【参考方案2】:

您在 urls 列中使用unique=True 吗? MySQL 正在该列上构建唯一索引,每个字符使用的字节数取决于编码。

例如,如果是 UTF-16,它将使用每个字符 2 个字节,因此您的 varchar(2000) 列将是 4000 个字节,并且如错误消息所述,最大密钥长度为 1000 个字节。

因此您可以切换到 UTF-8 并改用 varchar(900) 来解决此问题。

【讨论】:

【参考方案3】:

重写您的电子邮件字段,例如:

$table->string('email', 250)->unique();

【讨论】:

【参考方案4】:

Laravel 默认使用 utf8mb4 字符集,其中包括支持在数据库中存储“表情符号”。如果您运行的 MySQL 版本早于 5.7.7 版本或 MariaDB 版本早于 10.2.2 版本,您可能需要手动配置迁移生成的默认字符串长度,以便 MySQL 为其创建索引。您可以通过在 AppServiceProvider 中调用 Schema::defaultStringLength 方法来配置它:

use Illuminate\Support\Facades\Schema;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()

    Schema::defaultStringLength(191);

【讨论】:

以上是关于错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91的主要内容,如果未能解决你的问题,请参考以下文章

错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91

php 语法错误或访问冲突:1071指定密钥太长;最大密钥长度为767字节

SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节

1071 - 指定的密钥太长;最大密钥长度为 1000 字节 [重复]

SQLSTATE[42000]:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节

Symfony 3.4.4 + MariaDB 10.0.1 - SQLSTATE [42000]:语法错误或访问冲突:1071 指定的密钥太长;最大密钥长度为 767 字节