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的长度来解决这个问题。
极客教程