MySQL端口冲突应先查日志确认是否真为端口占用:若含“Bind on TCP/IP port”才是端口冲突,否则需修配置或权限;改XAMPP的my.ini中[mysqld]段port=3307,保存为UTF-8无BOM,重启服务,并同步更新phpMyAdmin、PHP代码及DSN中的端口号。

改端口本身很简单,但改完连不上、启动失败、PHP报错,才是真问题所在。
确认真的是 3306 被占,而不是 MySQL 根本没跑起来
很多人一看到 MySQL 启动失败就急着改端口,结果白忙活。先打开 XAMPP 控制面板 → 点击 MySQL 行右侧的 Logs 按钮,看最后一段错误:
- 如果含
Can't start server: Bind on TCP/IP port,才是端口冲突 - 如果含
unknown variable、innodb_data_file_path、Failed to open log file,说明my.ini有语法错误或数据目录损坏,得先修配置或恢复文件 - 如果日志为空或只有几行就断了,可能是权限问题(比如用普通用户启动控制面板)
只改 my.ini 的 [mysqld] 段,别碰别的地方
XAMPP 的 MySQL 配置文件路径是 C:\xampp\mysql\bin\my.ini(不是 etc 目录下那个)。用 VS Code 或记事本打开,找到 [mysqld] 段,在它下面加一行:
port=3307
注意三点:
-
port必须写在[mysqld]下,写在[client]或文件末尾无效 - 保存时选
UTF-8 无 BOM编码,否则 MySQL 可能静默退出(控制面板显示“已启动”,实则秒退) - 改完必须在控制面板里先点
Stop,再点Start;只点一次Start不会重载新配置
PHP 和 phpMyAdmin 连不上?它们还在找 3306
MySQL 端口改了,但 PHP 默认仍连 127.0.0.1:3306,所以你会看到 Connection refused。要同步改两处:
-
xampp\phpMyAdmin\config.inc.php:找到这行$cfg['Servers'][$i]['host'] = '127.0.0.1';,改成$cfg['Servers'][$i]['host'] = '127.0.0.1:3307'; - 你自己写的 PHP 连接代码:
mysqli_connect('127.0.0.1', 'root', '', 'test', 3307)(第 5 个参数是端口),或者用 DSN:mysql:host=127.0.0.1;port=3307 - 如果你用 PDO,
default_socket_timeout或mysqli.default_port在php.ini里设了也没用——DSN 必须显式带port=3307
别忘了查清谁在抢 3306,硬换端口可能埋坑
运行这条命令看谁占着:
netstat -ano | findstr :3306
拿到 PID 后,去任务管理器“详细信息”页搜它。常见干扰源:
- Docker Desktop 的 MySQL 容器(关掉容器比改 XAMPP 更干净)
- Skype(设置 → 高级 → 连接 → 取消勾选“使用 3306 端口”)
- 腾讯电脑管家、360 等安全软件的“数据库防护”模块
- Windows 自带的 Hyper-V / WSL2(关掉“Windows 功能”里的对应项可能释放端口)
如果只是临时开发,建议让 Docker 容器映射到 3307,而不是让 XAMPP 去迁就冷门端口——否则团队协作时,别人拉代码一跑就崩。


















