PHP创建数据库时无法指定端口,端口必须在mysqli_connect()或PDO DSN连接阶段设置;正确方式为mysqli_connect("127.0.0.1","user","pass","",3307)或$dsn="mysql:host=127.0.0.1;port=3307";建库操作仅通过已建立的连接执行。

PHP 创建数据库时无法直接指定端口
MySQLi 或 PDO 连接数据库时可以指定端口,但 CREATE DATABASE 语句本身不支持端口参数。端口必须在建立数据库连接阶段就确定,建库操作只是通过已建立的连接执行 SQL 命令。
常见误解是以为 mysqli_query($conn, "CREATE DATABASE ...") 能带端口,其实端口早已由 mysqli_connect() 或 PDO 构造函数决定。
mysqli_connect() 中指定端口的正确写法
端口需作为第 4 个参数传入 mysqli_connect(),不能拼在主机名里(除非用冒号语法且确保无歧义)。
- 推荐方式:显式传参,如
mysqli_connect("127.0.0.1", "user", "pass", "", 3307) - 主机名中带端口(仅限 IPv4):
mysqli_connect("127.0.0.1:3307", ...)—— 但某些旧版本或严格模式下可能失败 - 不要写成
"localhost:3307":MySQL 会优先走 socket,忽略端口;改用"127.0.0.1:3307"或显式端口参数 - 如果端口不是默认 3306,漏掉端口参数会导致连接被拒绝,错误类似
Connection refused或mysqli_connect(): (HY000/2002)
PDO 构造 DSN 时设置端口的方法
PDO 的 MySQL DSN 必须在 host 后用 port= 显式声明,不能只靠冒号拼接。
立即学习“PHP免费学习笔记(深入)”;
- 正确:
$dsn = "mysql:host=127.0.0.1;port=3307;dbname=test" - 错误:
"mysql:host=127.0.0.1:3307;..."—— 部分 PHP 版本解析异常,尤其 Windows 下易出错 - 若省略
port=,PDO 默认用 3306,不会读取 my.cnf 或环境变量 - 建库前需先用该 DSN 创建连接,再执行
$pdo->exec("CREATE DATABASE xxx")
建库后验证端口是否生效的简单方法
连接成功不代表建库走的是预期端口——得确认实际连接的是哪个 MySQL 实例。
- 执行
SELECT @@port查看当前连接的服务器端口 - 执行
SELECT @@socket辅助判断是否意外走了本地 socket(值非空且 host 是 localhost 时尤其要注意) - 用
netstat -tuln | grep :3307(Linux)或lsof -i :3307确认目标端口确有 mysqld 在监听 - 如果建库成功但后续连不上,大概率是应用代码里其他地方用了默认端口重连,而非建库时的连接
端口配置分散在连接初始化阶段,一旦连接建立,所有 SQL 操作(包括建库)都复用该连接通道——这点容易被忽略,导致排查时反复检查 CREATE 语句本身。











