在PHP与MySQL交互的场景中,阿拉伯字符属于多字节字符,若编码设置不统一,很容易出现存储后变成问号、乱码方块或者无法正确读取的问题,核心原因就是各个环节的字符集没有保持一致,最推荐的统一方案是使用UTF-8编码。

一、MySQL端编码设置
1. 数据库与数据表字符集配置
创建数据库和数据表时,需要明确指定字符集为utf8mb4,排序规则为utf8mb4_unicode_ci,utf8mb4是utf8的超集,支持更多特殊字符,包括阿拉伯字符的所有变体。
创建数据库的SQL语句如下:
-- 创建支持阿拉伯字符的数据库 CREATE DATABASE arabic_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
创建数据表的SQL语句如下:
-- 创建存储阿拉伯文本的数据表
CREATE TABLE arabic_content (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 已存在库表的编码修改
如果已经创建了库表,可以通过ALTER语句修改字符集:
-- 修改数据库字符集 ALTER DATABASE arabic_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改数据表字符集 ALTER TABLE arabic_content CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
二、PHP连接MySQL时的编码设置
PHP连接MySQL之后,需要主动设置连接的字符集为utf8mb4,避免默认编码和数据库不一致。
1. 使用mysqli扩展的设置方式
<?php
// 连接MySQL数据库
$conn = new mysqli('localhost', 'root', 'password', 'arabic_db');
// 检查连接是否成功
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
// 设置连接字符集为utf8mb4
if (!$conn->set_charset('utf8mb4')) {
die('设置字符集失败: ' . $conn->error);
}
// 插入阿拉伯字符示例
$arabic_text = 'مرحبا بالعالم'; // 阿拉伯语的你好世界
$stmt = $conn->prepare('INSERT INTO arabic_content (content) VALUES (?)');
$stmt->bind_param('s', $arabic_text);
$stmt->execute();
// 读取阿拉伯字符示例
$result = $conn->query('SELECT content FROM arabic_content');
while ($row = $result->fetch_assoc()) {
echo $row['content'] . '<br>';
}
$stmt->close();
$conn->close();
?>
2. 使用PDO扩展的设置方式
<?php
try {
// 连接时直接指定字符集
$pdo = new PDO(
'mysql:host=localhost;dbname=arabic_db;charset=utf8mb4',
'root',
'password',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// 插入阿拉伯字符
$arabic_text = 'مرحبا بالعالم';
$stmt = $pdo->prepare('INSERT INTO arabic_content (content) VALUES (?)');
$stmt->execute([$arabic_text]);
// 读取阿拉伯字符
$stmt = $pdo->query('SELECT content FROM arabic_content');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['content'] . '<br>';
}
} catch (PDOException $e) {
die('操作失败: ' . $e->getMessage());
}
?>
三、页面输出编码设置
PHP输出的页面也需要声明UTF-8编码,避免浏览器解析时出现乱码,有两种常用方式:
- 在PHP脚本开头设置header头:
<?php
// 声明页面输出编码为UTF-8
header('Content-Type: text/html; charset=utf-8');
?>
- 在HTML的head标签中设置meta标签:
<!DOCTYPE html>
<html lang="ar">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>阿拉伯字符展示</title>
</head>
<body>
</body>
</html>
四、常见问题排查
如果完成以上设置还是出现乱码,可以按照以下顺序排查:
| 排查项 | 检查方法 | 解决方式 |
|---|---|---|
| MySQL服务端默认字符集 | 执行SQL语句SHOW VARIABLES LIKE 'character_set%' | 修改MySQL配置文件my.cnf,在[mysqld]下添加character-set-server=utf8mb4,重启MySQL服务 |
| PHP文件本身编码 | 查看代码编辑器的文件编码设置 | 将PHP文件保存为UTF-8无BOM格式 |
| 表单提交编码 | 检查表单的accept-charset属性 | 给表单添加accept-charset="UTF-8"属性 |
注意:不要使用utf8代替utf8mb4,MySQL中的utf8字符集最多只支持3字节字符,部分阿拉伯字符变体需要4字节存储,使用utf8会导致存储失败或者乱码。