核心原因是mysql中不存在配置的数据库名;需确认db_database为已创建的纯库名而非sql文件路径,检查.env文件位置和格式,登录mysql执行show databases验证并创建缺失库,开启pdo异常模式获取明确错误提示。

报错 SQLSTATE[HY000] [1049] Unknown database,核心原因只有一个:ThinkPHP 尝试连接的数据库在 MySQL 服务器上根本不存在。不是密码错、不是端口不通、也不是用户没权限——是那个库名,MySQL 压根没听说过。
确认 DB_DATABASE 值是纯库名,不是文件路径
这是最常踩的坑。DB_DATABASE 必须是一个已创建好的数据库名称,比如 cardgame、test_db 或 lianxi_2026。
- ❌ 错误写法:
DB_DATABASE=D:\PHP\DGAPI\database01.sql或DB_DATABASE=/var/www/sql/init.sql - ✅ 正确写法:
DB_DATABASE=cardgame - SQL 文件只是数据脚本,必须手动导入到已存在的库中,不能当库名用
检查 .env 文件是否生效且格式正确
.env 不是摆设,但有几个硬性条件它才起作用:
- .env 文件必须放在项目根目录(和
think可执行文件同级),不能放在config/或app/下 -
APP_DEBUG=true必须开启,否则环境变量加载逻辑会被跳过 - 键名全大写+下划线,例如
DB_DATABASE=cardgame,不能写成db_database或Db_Database - 可在控制器里加
dump(env('DB_DATABASE'));验证是否读取成功;输出null就说明没加载
登录 MySQL 直接验证库是否存在
别猜,直接进 MySQL 看一眼最可靠:
- 命令行执行:
mysql -u root -p→ 输入密码后运行SHOW DATABASES; - 确认列表里真有你写的那个库名,注意大小写(Linux 系统区分大小写)
- 如果不在列表中,立刻用
CREATE DATABASE cardgame CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;创建 - 创建后再次
SHOW DATABASES;确认已出现
打开 PDO 异常模式,让错误更具体
ThinkPHP 默认不抛出详细错误,容易掩盖真实问题。临时在数据库配置中加入:
'params' => [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ]- 加上后,1049 错误会明确指出是 “Unknown database 'xxx'”,而不是笼统的连接失败
- 上线前务必删掉这行,避免敏感信息泄露
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











