必须先用mysqli_connect()连接MySQL服务器并确保账号有CREATE DATABASE权限,再用mysqli_query()执行带IF NOT EXISTS和utf8mb4字符集的CREATE DATABASE语句,建库后需切换并建表验证。

用 mysqli_connect 创建数据库前必须先连上 MySQL 服务器
直接调用 mysqli_query() 创建数据库会报错,因为 PHP 不允许在未建立连接的情况下执行 SQL。你得先用 mysqli_connect() 连到 MySQL(通常是 localhost、端口 3306),且账号要有 CREATE DATABASE 权限。
常见错误现象:mysqli_query(): Couldn't fetch mysqli 或 mysqli_query(): Access denied for user ... (using password: YES) —— 都是连接失败或权限不足导致的。
- 连接时建议显式传入
$host、$username、$password、$port(不要依赖mysqli.default_host等 ini 设置) - 连接成功后,用
mysqli_select_db()并非必需;创建数据库用的是CREATE DATABASE语句,不依赖当前选中的库 - 如果连接返回
false,立刻用mysqli_connect_error()查原因,别跳过这步
CREATE DATABASE 语句要加 IF NOT EXISTS 避免重复报错
生产环境里反复运行建库脚本很常见,没加 IF NOT EXISTS 会导致 mysqli_query() 返回 false,并抛出错误:Can't create database 'xxx'; database exists。
正确写法是把整个建库语句当字符串传给 mysqli_query():
立即学习“PHP免费学习笔记(深入)”;
采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压
$sql = "CREATE DATABASE IF NOT EXISTS `myapp_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if (!mysqli_query($conn, $sql)) {
echo "建库失败:" . mysqli_error($conn);
}
- 数据库名必须用反引号
`包裹,尤其含短横线或数字开头时(如`my-app-db`) -
CHARACTER SET utf8mb4是必须项,utf8在 MySQL 8.0+ 已被标记为别名,实际等价于utf8mb3,不支持 emoji - 别在建库语句里写
USE myapp_db—— 那是切换当前库,不是建库的一部分
pdo::exec() 创建数据库更简洁,但同样依赖有效连接
用 PDO 的话,PDO::exec() 直接执行 DDL 语句,比 mysqli_query() 少一层返回值判断逻辑,但前提是 $pdo 对象已成功初始化。
示例代码:
try {
$pdo = new PDO("mysql:host=localhost;port=3306", "root", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE DATABASE IF NOT EXISTS `myapp_db` CHARACTER SET utf8mb4");
} catch (PDOException $e) {
echo "建库异常:" . $e->getMessage();
}
- DSN 中不能带
dbname=xxx,否则 PDO 会尝试连接那个不存在的库,直接报错 - 必须设
PDO::ATTR_ERRMODE为PDO::ERRMODE_EXCEPTION,否则exec()出错只返回false,不抛异常 - PDO 不自动处理字符集声明,
CHARACTER SET得写在 SQL 里,不能靠 DSN 参数
建库后立即切换并测试表创建,才能确认权限和编码真正生效
很多人以为 CREATE DATABASE 成功就万事大吉,其实后续建表时可能因默认字符集不匹配或权限粒度问题失败。最稳妥的做法是:建完立刻 USE,再建一张最小表验证。
- 用
mysqli_select_db($conn, 'myapp_db')或$pdo->exec("USE `myapp_db`")切换上下文 - 接着执行
CREATE TABLE test(id INT),如果失败,大概率是myapp_db的默认字符集没继承好,或者用户没被授予该库的CREATE权限 - MySQL 8.0+ 默认启用
sql_mode=STRICT_TRANS_TABLES,建表时若字段没设NOT NULL或没默认值,也可能报错,别只盯着建库环节










