1071 Specified key was too long; max key length is 1000 bytes

laravel用php artisan migrate在 mysql中创建表时候报错:1071 Specified key was too long; max key length is 1000 bytes

原因:索引的长度超过mysql的限定长度1000 bytes

解决方法:在提供者AppServiceProvider 中调用 Schema::defaultStringLength 方法来完成配置

use Illuminate\Support\Facades\Schema;

/**
 * Bootstrap any application services.
 *
 * @return void
 * @translator laravelacademy.org
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

`1071 - Specified key was too long; max key length is 1000 bytes` 这是一个常见的 MySQL 错误提示,表示你在创建索引时指定的关键字长度超出了数据库支持的最大限制。 ### 原因分析 这个错误通常发生在以下几种情况: 1. **字段字符集占用空间过大**:例如使用 `utf8mb4` 字符集时,每个字符最多需要 4 个字节存储。如果设置了较大的字符串作为索引列(如超过 255 字符),就可能导致总长度超出最大值。 2. **联合索引的字段过多或过长**:当多个字段组合成复合索引时,所有字段的长度加起来可能会超出允许范围。 3. **MySQL 配置限制**:InnoDB 引擎对单个索引条目的大小有限制,默认为 767 字节(对于某些版本可能是 1000 或者其他自定义配置)。 --- ### 解决方案 #### 方案一:调整字段类型或减少索引长度 如果你正在尝试给一个较长的字符串字段添加索引,可以考虑仅为其前缀部分建立索引。例如: ```sql ALTER TABLE your_table ADD INDEX (your_column(255)); ``` 这里的 `(255)` 表示只针对该字段的前 255 个字符创建索引。 #### 方案二:更改表默认字符集 从 `utf8mb4` 改为更小开销的编码格式比如 `utf8` 可能会有所帮助,因为后者只需要三个字节就能保存大部分常用字符: ```sql ALTER TABLE your_table CONVERT TO CHARACTER SET utf8; ``` 不过需要注意的是这样做可能丢失表情符号等特殊Unicode的支持能力。 #### 方案三:升级MySQL版本并启用大页设置 较新的 MySQL 版本支持更大的行尺寸和键大小,通过修改 InnoDB 参数也可以扩大索引用的空间限额。例如,在 my.cnf 文件里加入下面这句命令然后重启服务即可生效: ```ini [mysqld] innodb_large_prefix=ON ``` 同时还需要保证使用的引擎及文件格式兼容此特性(推荐将 ROW_FORMAT 设置为 DYNAMIC 或 COMPRESSED) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值