答案是统一使用UTF-8编码可解决php+mysql乱码问题。需确保数据库和数据表创建时指定utf8mb4字符集,已有表可通过ALTER语句转换;PHP连接MySQL时应使用mysqli的set_charset方法或pdo在DSN中设置charset=utf8mb4;PHP输出前发送header(“Content-Type: text/html; charset=utf-8”);HTML中添加<meta charset="UTF-8">标签;同时PHP文件须保存为UTF-8无bom格式。常见错误包括仅修改数据库编码而忽略连接字符集或文件编码不一致,导致乱码仍出现。

PHP+MySQL出现乱码,通常是因为字符集不统一导致的。只要确保从数据库、数据表、连接通道到PHP输出整个流程使用相同的字符编码(推荐UTF-8),就能有效解决乱码问题。
1. 确保数据库和数据表使用UTF-8编码
创建数据库和数据表时,明确指定字符集为UTF-8:
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE mydb; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
如果已有数据表,可以通过以下语句修改字符集:
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 设置mysql连接字符集
在PHP连接MySQL后,立即设置连接使用的字符集。使用不同的扩展方式设置方法略有不同:
立即学习“PHP免费学习笔记(深入)”;
使用 mysqli 扩展:
$mysqli = new mysqli("localhost", "user", "password", "mydb"); $mysqli->set_charset("utf8mb4");
使用 PDO 扩展:
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", "user", "password");
注意:PDO中在DSN中直接指定charset是关键,仅靠exec(“SET NAMES utf8”)不够可靠。
3. PHP页面输出声明为UTF-8
在PHP文件中,确保输出内容前设置了正确的http头:
header("Content-Type: text/html; charset=utf-8");
同时,保存PHP源文件本身也必须是UTF-8无BOM格式,否则可能引入额外乱码。
4. HTML页面设置字符集
<meta charset="UTF-8">
基本上就这些。只要数据库、连接、php脚本、HTML输出四者都统一使用UTF-8(推荐utf8mb4),中文乱码问题基本都能解决。常见错误是只改了数据库却忘了设连接字符集,或PHP文件保存成了GBK编码。检查每一步是否一致,问题就不难定位。