PHP中无法直接创建MySQL数据库,需通过执行CREATE DATABASE SQL语句实现;必须使用有CREATE权限的用户连接(不指定数据库名),并显式设置字符集与反引号包裹库名。
这是最常被误解的一点:mysqli 或 PDO 扩展本身不提供「建库」的专用函数,而是通过执行 CREATE DATABASE SQL 语句来实现。也就是说,你得先连上 MySQL 服务器(通常用 root 或有 CREATE 权限的账号),再发一条原生 SQL 命令。
必须确保连接用户有 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 不提供 createDatabase() 这类封装方法,本质仍是执行 SQL。但它支持异常模式,更容易捕获建库失败原因。
关键点:
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 方式)new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", ...)
CREATE TABLE `mydb`.`users` (...)
字符集不一致、权限不足、SQL 语法拼错——这三个是最常卡住的地方,尤其在 Docker 或云数据库环境下,root 用户默认可能被禁用或限制建库权限。