“unknown database”错误源于db_database值在mysql中不存在,需登录mysql执行show databases确认并手动创建库,且必须用反引号包裹含特殊字符的库名;同时检查db_host/db_port连通性、清除配置缓存php artisan config:clear,并用config('database.connections.mysql.database')验证实际生效值。

“Unknown database”错误不是迁移命令本身的问题,而是 Laravel 根本连不上数据库——.env 里填的 DB_DATABASE 值在 MySQL 中根本不存在。
检查 .env 中的 DB_DATABASE 是否真实存在
错误信息如 SQLSTATE[HY000] [1049] Unknown database 'laraver1',说明 MySQL 服务运行正常,但数据库名 laraver1 并未创建。
- 先登录 MySQL 控制台:运行
mysql -u root -p,输入密码后执行SHOW DATABASES;,确认目标库名是否在列表中 - 若不存在,手动创建:运行
CREATE DATABASE `your_db_name` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 不要依赖迁移命令自动建库——Laravel
php artisan migrate从不创建数据库,只操作已有库中的表 - 注意反引号:MySQL 中数据库名含短横线(如
my-app)必须用反引号包裹,否则解析失败
确认 DB_HOST 和 DB_PORT 能实际连通
即使 DB_DATABASE 正确,如果 DB_HOST 指向一个无法访问的地址(比如 Docker 容器别名写错、localhost 在 WSL 中指向 Windows 主机),也会被 MySQL 返回 “Unknown database”——因为连接被路由到了错误实例或拒绝响应。
- 在终端直接测试连通性:
mysql -h 127.0.0.1 -P 3306 -u your_user -p -D your_db_name - 若提示
Access denied,说明凭据或权限问题;若提示Can't connect to MySQL server,才是网络/端口问题 - Docker 环境下,
DB_HOST应填容器服务名(如mysql),而非localhost或127.0.0.1 - Laravel 默认使用
DB_PORT=3306,但某些 MAMP/XAMPP 安装会改用 8889,务必核对
避免 .env 缓存导致配置未生效
修改 .env 后仍报旧库名,大概率是 Laravel 缓存了配置。Artisan 命令(包括 migrate)读的是缓存后的配置,不是实时解析 .env。
- 运行
php artisan config:clear清除配置缓存 - 再运行
php artisan config:cache(仅生产环境推荐)或直接测试php artisan tinker后输入config('database.connections.mysql.database')查看当前生效值 - 不要在部署脚本中漏掉
config:clear——尤其在 CI/CD 自动部署时,缓存可能残留上一次的错误库名 - 验证方式:临时在
config/database.php中硬编码'database' => 'test_db',再跑迁移。若成功,就坐实是.env或缓存问题
最易忽略的一点:错误信息里的数据库名,未必是你在 .env 里写的那个——它可能是配置文件中某个条件分支(如基于 APP_ENV 的不同连接)最终取到的值,所以一定要用 config() 函数实际查,而不是只盯 .env 文件。











