laravel 迁移中为 email 字段添加 `->unique()` 时出现 “connection refused” 错误,实际根源常是数据库连接异常或字段类型与索引限制不兼容;本文详解排查逻辑、根本原因(如 mariadb 10.4+ 对 text 字段 unique 索引的支持差异)及安全可靠的解决方案。
在 Laravel 中为 email 字段添加唯一约束看似简单——只需在迁移文件中写 $table->string(’email’, 80)->unique(),但执行 php artisan migrate 时却报错:
SQLSTATE[HY000] [2002] Connection refused (SQL: alter table `users` add unique `users_email_unique`(`email`))
⚠️ 注意:该错误 并非 源于 unique() 语法本身,也不是 Schema::defaultStringLength(191) 配置失效——而是典型的数据库连接层异常伪装成 SQL 语法错误。Connection refused 明确指向 MySQL/MariaDB 服务未运行、端口不通、认证失败或配置错误(如 .env 中 DB_HOST、DB_PORT、DB_USERNAME/DB_PASSWORD 不正确),而非索引长度问题。
✅ 正确排查顺序如下:
-
验证数据库服务状态
# Linux/macOS sudo systemctl status mariadb # 或 mysql # 或尝试手动连接 mysql -h 127.0.0.1 -P 3306 -u your_user -p
-
检查 .env 数据库配置
确保以下字段准确无误(尤其 DB_HOST 不要写成 localhost —— 在某些 Docker 或 IPv6 环境下会导致解析失败,建议显式用 127.0.0.1):DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=your_db_name DB_USERNAME=your_user DB_PASSWORD=your_password
修改后务必重载配置: