在 PHP 和 MySQL 的交互中,如果遇到中文问号(?),通常是因为在数据库查询或 PHP 代码中出现了乱码或编码问题。以下是常见原因及解决方法:
✅ 一、问题原因
-
数据库连接编码不一致
- MySQL 数据库使用的是
utf8mb4编码,而 PHP 未正确设置编码。 - 或者 PHP 未设置
mysql_real_escape_string,导致 SQL 注入或乱码。
- MySQL 数据库使用的是
-
PHP 未设置
mbstring模块- 如果 PHP 未启用
mbstring模块,处理中文字符时会出错。
- 如果 PHP 未启用
-
数据库连接参数未设置编码
- MySQL 连接时未指定
charset参数,导致数据传输乱码。
- MySQL 连接时未指定
✅ 二、解决方法
1. MySQL 数据库设置编码为 utf8mb4
-- 修改数据库字符集
ALTER DATAbase your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改表字符集
ALTER TABLE your_table_name ConVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. PHP 设置编码
在 PHP 配置文件(php.ini)中设置:
; 设置 PHP 的默认字符集
default_charset = "utf-8"
; 启用 mbstring 模块
mbstring.enable_xss_escape = On
; 设置 session 编码
session.charset = "utf-8"
session.character_set_client = "utf-8"
session.character_set_server = "utf-8"
3. PHP 连接数据库时设置编码
在 PHP 代码中:
$mysqli = new mysqli("localhost", "user", "password", "database");
// 设置连接字符集
$mysqli->set_charset("utf8mb4");
// 检查连接是否成功
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
4. 处理中文字符时使用 mb_convert_encoding
在 PHP 中处理中文时,使用 mb_convert_encoding 来确保编码正确:
$text = "你好,世界!";
$utf8_text = mb_convert_encoding($text, 'UTF-8', 'GB2312');
echo $utf8_text;
✅ 三、常见命令和脚本示例
1. 查询数据库并输出中文
mysql -u your_user -p -e "SELECT * FROM your_table; "
2. PHP 查询数据库并输出中文
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
// 设置字符集
$mysqli->set_charset("utf8mb4");
// 查询数据
$result = $mysqli->query("SELECT * FROM your_table");
while ($row = $result->fetch_assoc()) {
echo "中文内容: " . $row['column_name'] . "n";
}
$result->close();
$mysqli->close();
?>
✅ 四、总结
| 问题 | 解决方法 |
|---|---|
| 中文乱码 | 设置数据库和 PHP 编码为 utf8mb4 |
| PHP 未支持中文 | 启用 mbstring 模块 |
| 数据库连接字符集未设置 | 在连接时设置 charset 参数 |
如果你有具体的 PHP 代码或 MySQL 查询语句,可以提供,我可以帮你排查和修复乱码问题。

