PHP中无法直接创建MySQL数据库,需通过执行CREATE DATABASE SQL语句实现;必须使用有CREATE权限的用户连接(不指定数据库名),并显式设置字符集与反引号包裹库名。

PHP 里不能直接创建 MySQL 数据库
这是最常被误解的一点:mysqli 或 PDO 扩展本身不提供「建库」的专用函数,而是通过执行 CREATE DATABASE SQL 语句来实现。也就是说,你得先连上 MySQL 服务器(通常用 root 或有 CREATE 权限的账号),再发一条原生 SQL 命令。
用 mysqli_connect + mysqli_query 创建数据库
必须确保连接用户有 CREATE 权限,否则会报错 Access denied for user ... to database 'xxx'(注意:不是说数据库不存在,而是没权限建)。
实操建议:
- 不要在连接时指定数据库名(即
mysqli_connect($host, $user, $pass)第四个参数留空) - 连接成功后,立即用
mysqli_query($conn, "CREATE DATABASE `mydb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") - 务必用反引号包裹数据库名,避免关键字冲突(比如叫
order、group) - 显式指定字符集和排序规则,否则可能默认为
latin1,后续存中文会乱码
PDO 方式更安全,但一样要手写 SQL
PDO 不提供 createDatabase() 这类封装方法,本质仍是执行 SQL。但它支持异常模式,更容易捕获建库失败原因。
立即学习“PHP免费学习笔记(深入)”;
Destoon B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。 系统特性1、跨平台。支持Linux/Unix/Windows服务器,支持Apache/IIS/Zeus等2、跨浏览器。基于最新Web标准构建,在
关键点:
- 连接 DSN 中不要带
dbname=xxx,否则 PDO 会尝试连到一个不存在的库而报错 - 开启异常模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) - 建库语句仍需手动执行:
$pdo->exec("CREATE DATABASE `test_db`") - 如果数据库已存在,会抛出
SQLSTATE[HY000]: General error: 1007 Can't create database 'xxx'; database exists,需自行try/catch处理
建库后立刻选中并建表?别跳步
刚执行 CREATE DATABASE 并不等于当前连接就自动切换过去了。很多新手紧接着调 mysqli_query($conn, "CREATE TABLE ...") 却报错 No database selected。
正确做法是:
- 建库后,用
mysqli_select_db($conn, 'mydb')切换(mysqli方式) - 或重新用新数据库名创建 PDO 实例:
new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", ...) - 也可以在建表语句里显式带上库名:
CREATE TABLE `mydb`.`users` (...)
字符集不一致、权限不足、SQL 语法拼错——这三个是最常卡住的地方,尤其在 Docker 或云数据库环境下,root 用户默认可能被禁用或限制建库权限。










