MySQL Laravel Migration: 唯一键过长即使已指定

MySQL Laravel Migration: 唯一键过长即使已指定

如果你在使用Laravel的migration过程中遇到以下错误:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `table_name` add unique `table_name_column_unique`(`column`))

这就意味着你的唯一键过长,即使你已经使用了 unique 方法指定了唯一键。那么该如何解决呢?

阅读更多:MySQL 教程

问题原因分析

这个错误是由于MySQL在使用utf8mb4字符集时,每个字符需要4个字节来编码而不是原来的3个字节,所以当你的唯一键长度大于767时,就会产生这个错误。

解决方案

1.修改数据库默认字符集

在创建数据库时,我们可以在 CREATE DATABASE 语句后添加如下内容:

DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果你已经创建了数据库,你也可以在MySQL中修改:

ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 在migration文件中指定字符集

在migration文件中创建表时,我们可以使用以下方法来指定字符集和比较方式:

Schema::create('table_name', function (Blueprint table) {table->engine = 'InnoDB';
    table->charset = 'utf8mb4';table->collation = 'utf8mb4_unicode_ci';
});

3. 指定varchar的长度

如果你使用的是 varchar 类型的字段,你可以指定其长度,来避免唯一键过长的问题:

$table->string('column_name', 191)->unique();

这是因为191是767÷4的最接近整数。

总结

唯一键过长的问题是由于MySQL在使用utf8mb4字符集时,每个字符需要4个字节来编码而不是原来的3个字节,导致长度超标。我们可以通过修改数据库默认字符集、在migration文件中指定字符集或指定varchar的长度来解决这个问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程