You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDO执行MySQL建表语句报错1046未选择数据库如何解决

错误原因

你遇到的PHP Fatal error: Uncaught PDOException: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected报错,核心触发逻辑是:程序虽然成功和MySQL服务建立了网络连接,但连接没有绑定要操作的目标数据库,执行SQL时MySQL无法确定操作的库范围,因此抛出异常。
常见的具体触发场景:

  • PDO初始化的DSN连接串中漏写了dbname配置项,仅配置了MySQL服务地址、端口,未指定默认操作的数据库
  • DSN中填写的dbname值拼写错误,和MySQL中实际存在的库名不匹配
  • 连接使用的数据库账号没有目标数据库的访问权限,导致指定库名后无法完成选库操作
  • 连接建立后既没有在DSN中指定默认库,也没有主动执行选库语句

你提供的建表方法本身SQL语法没有问题,问题出在连接的选库环节,和建表逻辑无关。

修复方法

按以下步骤排查修复即可:

  1. 检查PDO初始化的DSN配置,确保正确携带dbname参数,标准配置格式参考:
// 正确的MySQL PDO连接DSN示例
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=替换为你的实际业务库名;charset=utf8mb4";
$this->pdo = new PDO($dsn, "替换为你的数据库用户名", "替换为你的数据库密码");
  1. 如果不想修改原有DSN配置,可以在执行建表SQL前,主动执行选库语句指定操作库:
protected function createMigrationsTable()
{
    // 先选中目标数据库
    $this->pdo->exec("USE 替换为你的实际业务库名");
    // 再执行建表逻辑
    $this->pdo->exec("CREATE TABLE IF NOT EXISTS migrations (
        id INT AUTO_INCREMENT PRIMARY KEY,
        migration VARCHAR(255),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )  ENGINE=INNODB;");
}
  1. 配套校验项:
    • 确认你填写的库名在MySQL服务中真实存在
    • 确认连接使用的数据库账号拥有对应库的CREATE、INSERT、SELECT等迁移操作所需的权限

内容的提问来源于stack exchange,提问作者Mahmoud Khosravi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:33:26