php 8.5.5 连接 mariadb 与 mysql 几乎完全相同,只需启用 pdo 或 mysqli 扩展、配置正确 dsn(含 charset=utf8mb4)、确保 mariadb 服务运行且监听地址正确,群晖等特殊环境需注意 web station 配置生效和 socket 路径。

PHP 8.5.5 连接 MariaDB,和连接 MySQL 几乎完全一样,只要 PDO 或 MySQLi 扩展启用、DSN 正确、字符集设对,就能跑起来。MariaDB 从 10.2 起就彻底兼容 MySQL 协议,PHP 层面无需额外驱动或特殊配置。
确认 PDO 或 MySQLi 扩展已启用
PHP 8.5.5 默认不自动启用数据库扩展,必须手动检查并启用。常见错误如 Fatal error: Class 'PDO' not found 或 Class 'mysqli' not found 都源于此。
- 运行
php -m | grep -i pdo或php -m | grep -i mysql查看是否列出pdo_mysql和/或mysqli - 若未启用,打开
php.ini,取消注释(删掉前面的分号):extension=pdo_mysql和/或extension=mysqli - 特别注意
extension_dir必须指向正确的扩展目录(例如 Windows 下是extension_dir = "C:\php\ext",Linux 下通常是/usr/lib/php/20230831/,具体路径用php -i | grep extension_dir确认) - 改完重启 Web 服务(Apache/Nginx)或 PHP-FPM 进程
PDO 连接 MariaDB 的关键 DSN 写法
DSN 是连接成败的核心,漏掉 charset=utf8mb4 或写错端口、host,都会导致乱码或连接失败。
- 标准写法:
"mysql:host=localhost;port=3306;dbname=testdb;charset=utf8mb4"——port显式写出更稳妥,尤其在群晖 NAS 或 Docker 环境中,MariaDB 有时监听非默认端口 - 若用 Unix socket(如群晖或本地开发),DSN 改为:
"mysql:unix_socket=/run/mysqld/mysqld.sock;dbname=testdb;charset=utf8mb4",此时忽略host和port -
charset=utf8mb4不可省略:MariaDB 默认字符集是utf8mb4,但 PHP PDO 不会自动继承,不显式声明会导致中文存入变问号或截断 - 避免写成
charset=utf8:MySQL/MariaDB 中的utf8实为utf8mb3,不支持 emoji 和部分生僻汉字
连接失败时最常踩的三个坑
报错信息往往模糊,比如 SQLSTATE[HY000] [1045] Access denied 看似权限问题,实际可能根本没连上服务。
-
Connection refused:不是密码错,而是 MariaDB 服务根本没运行,或监听地址不对(检查bind-address是否为127.0.0.1或0.0.0.0;群晖默认只监听127.0.0.1,远程访问需手动改配置) -
Unknown database:数据库名拼错,或该库确实不存在——PHP 不会自动创建库,必须提前用CREATE DATABASE建好 -
could not find driver:不是驱动没装,而是pdo_mysql没启用,或启用了pdo_pgsql等其他 PDO 驱动却误以为它能连 MariaDB
群晖 NAS 上的特殊处理
群晖 Web Station 的 PHP 配置独立于系统全局配置,Web 界面改完后必须点击「应用」才会真正写入生效,且重启 Web Station 才会加载新设置。
- 进「控制面板 → Web Station → 脚本语言 → PHP → 自定义配置文件 → 用户定义」
- 勾选
pdo_mysql和mysqli(两者选一即可,推荐前者) - 保存后务必点右下角「应用」按钮——很多人改了但没点应用,配置实际未生效
- 测试脚本里加一行
var_dump(extension_loaded('pdo_mysql'));,返回true才算成功
真正麻烦的不是写几行连接代码,而是环境链路上任何一环出问题:扩展没启、socket 路径错、MariaDB 没监听、防火墙挡着、甚至 PHP-FPM 用户没权限读 socket 文件。建议每步都用最小验证脚本确认,别堆一起调试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











