PHP8连接MariaDB常见错误本质是编码链断裂、权限未显式授权或驱动未适配;须先确认服务状态(systemctl status mariadb)、改localhost为127.0.0.1、全局配置utf8mb4并显式指定charset=utf8mb4、创建专用用户授权、启用pdo_mysql扩展。

PHP8连接MariaDB时出现“Connection refused”“Access denied”或插入连字符报“Incorrect string value”,本质是编码链断裂、权限未显式授权或驱动层未适配,不是单纯换个host就能解决。
确认MariaDB服务状态与网络通路
先执行systemctl status mariadb(Linux)或services.msc里检查MariaDB服务是否正在运行;若显示inactive,直接运行sudo systemctl start mariadb启动服务。
用mysql -u root -p尝试本地登录,能进说明服务正常;若提示Access denied,说明root密码被重置或未设密码,需用sudo mysql_safe --skip-grant-tables &临时绕过验证重设密码。
PHP脚本中host不能写localhost——它会强制走Unix socket,而MariaDB默认禁用socket连接;必须改用127.0.0.1,否则PDO抛出SQLSTATE[HY000] [2002] Connection refused。
立即学习“PHP免费学习笔记(深入)”;
强制统一UTF8MB4编码链
这一步漏掉,后续所有插入含–、 emoji、中文标点的数据都会失败。
第一步:修改MariaDB全局配置。编辑/etc/my.cnf(或/etc/mysql/mariadb.conf.d/50-server.cnf),在[mysqld]段下添加:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake
init_connect='SET NAMES utf8mb4'
第二步:重启MariaDB使配置生效,再登录执行:
ALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
第三步:PHP连接时必须显式指定charset,PDO DSN里不能只写host和dbname,要补全charset=utf8mb4,例如:
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8mb4', $user, $pass);
【不加charset=utf8mb4参数,PHP默认用latin1握手,哪怕数据库表是utf8mb4也白搭】
创建专用用户并授最小权限
方法一:用root登录MariaDB后执行:
CREATE USER 'phpapp'@'127.0.0.1' IDENTIFIED BY 'StrongP@ss2026';
GRANT SELECT, INSERT, UPDATE, DELETE ON `your_db_name`.* TO 'phpapp'@'127.0.0.1';
FLUSH PRIVILEGES;
方法二:如果应用部署在Docker或远程服务器,host不能写127.0.0.1,得换成具体IP或%(不推荐生产环境用%);执行GRANT时若报ERROR 1410,说明该用户已存在,先DROP USER 'phpapp'@'127.0.0.1';再重建。
注意:MariaDB 10.6+默认启用password validation plugin,简单密码如123456会被拒绝,必须含大小写字母+数字+符号。
验证PDO扩展与驱动兼容性
运行php -m | grep pdo,确认输出含pdo和pdo_mysql;若只有pdo没有pdo_mysql,说明扩展未启用。
找到php.ini路径:php --ini,打开Loaded Configuration File指向的文件,在extension_dir行确认路径正确(如Linux为/usr/lib/php/20220829/),再检查该目录下是否存在pdo_mysql.so文件。
取消php.ini中;extension=pdo_mysql前的分号,保存后重启Web服务(Apache用sudo systemctl restart apache2,Nginx用sudo systemctl restart php8.3-fpm)。
最后执行php -r "new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8mb4', 'phpapp', 'StrongP@ss2026');",无报错即连接成功。



















