SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length i

这个错误是最常见的laravel错误了,使用mysql的时候,必出现,这么多年还没有修复。

laravel 12 修复:在 app/Providers/AppServiceProvider.php 中引入 Schema 并设置默认字符串长度为 191,

    public function boot(): void
    {
        Schema::defaultStringLength(191);
    }

D:\phpstudy_pro\class>php artisan migrate

   INFO  Preparing database.  

  Creating migration table ............................................................................................................ 17.71ms DONE

   INFO  Running migrations.  

  0001_01_01_000000_create_users_table ................................................................................................. 5.98ms FAIL

   Illuminate\Database\QueryException 

  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (Connection: mysql, SQL: alter table `users` add unique `users_email_unique`(`email`))

  at vendor\laravel\framework\src\Illuminate\Database\Connection.php:824
    820▕                     $this->getName(), $query, $this->prepareBindings($bindings), $e
    821▕                 );
    822▕             }
    823▕
  ➜ 824▕             throw new QueryException(
    825▕                 $this->getName(), $query, $this->prepareBindings($bindings), $e
    826▕             );
    827▕         }
    828▕     }

  1   vendor\laravel\framework\src\Illuminate\Database\Connection.php:570
      PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes")

  2   vendor\laravel\framework\src\Illuminate\Database\Connection.php:570
      PDOStatement::execute()

原理:

- MySQL 使用 utf8mb4 ,默认 string(255) 上建唯一索引会超过 InnoDB 旧版本的 1000 字节限制,触发错误 Specified key was too long; max key length is 1000 bytes 。
- 报错发生在为 users.email 创建唯一索引时。
实施修复:

- 在 app/Providers/AppServiceProvider.php 中引入 Schema 并设置默认字符串长度为 191,使索引长度落在安全范围:
  - 修改的文件: d:\phpstudy_pro\class\app\Providers\AppServiceProvider.php
  - 关键代码:
    - use Illuminate\Support\Facades\Schema;
    - 在 boot() 中添加: Schema::defaultStringLength(191);
- 由于 users 表已存在导致再次迁移失败,已执行 php artisan migrate:fresh 清理并重建所有表,迁移后成功。
验证结果

- 迁移输出显示:
  - create_users_table 、 create_cache_table 、 create_jobs_table 均 DONE
- 你的项目现在可以正常在当前 MySQL 设置下创建唯一索引。
推荐做法与备选方案

- 如果将来升级到较新 MySQL/ MariaDB(启用 innodb_large_prefix / DYNAMIC 行格式),也可以保留 string(255) 无需此限制。
- 备选修复(不改全局默认长度):
  - 在具体迁移中把需要建索引的字段改为 string('email', 191)->unique() 。
  - 或在 config/database.php 将 MySQL 连接的 charset / collation 改为 utf8 / utf8_unicode_ci (不推荐,可能影响表情符号等字符)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值