在使用 PHP 操作 MySQL 数据库时,字符编码问题往往是开发者们最头痛的难题之一,尤其是涉及中文、日文、韩文等非英文字符时。很多人遇到插入或查询数据库后中文变成乱码,往往是因为字符集没有设置正确。
本文将介绍如何使用 mysqli::get_charset 方法来检查当前 MySQLi 连接的字符集设置,从而确保非英文字符(比如中文)能被正确编码处理。
MySQL 支持多种字符集,例如 latin1、utf8、utf8mb4 等。如果你的网站内容包含中文,推荐使用 utf8mb4,因为它兼容 Emoji 和几乎所有 Unicode 字符。
但仅仅在数据库层面设置了字符集还不够,你在 PHP 和数据库之间的连接中也必须设置一致的字符集。否则,发送到数据库的数据可能在到达前就已经被错误编码,导致乱码。
mysqli::get_charset 方法可以用来查看当前连接使用的字符集信息,返回的是一个包含字符集细节的对象。通过这个方法,你可以写出检测代码来确保连接设置正确。
<?php
// 数据库连接配置
$host = 'localhost';
$user = 'dbuser';
$password = 'dbpassword';
$database = 'testdb';
// 创建 mysqli 对象
$mysqli = new mysqli($host, $user, $password, $database);
// 检查连接是否成功
if ($mysqli->connect_error) {
die('连接失败: ' . $mysqli->connect_error);
}
// 设置字符集为 utf8mb4(推荐支持中文和 Emoji)
if (!$mysqli->set_charset('utf8mb4')) {
die('错误设置字符集: ' . $mysqli->error);
}
// 使用 get_charset 检查当前字符集
$charset_info = $mysqli->get_charset();
echo "当前字符集: " . $charset_info->charset . "<br>";
echo "字符集说明: " . $charset_info->comment . "<br>";
echo "字符集目录: " . $charset_info->dir . "<br>";
echo "最大字节长度: " . $charset_info->max_length . "<br>";
// 测试插入中文数据
$sql = "INSERT INTO test_table (content) VALUES ('测试中文字符')";
if ($mysqli->query($sql)) {
echo "成功插入中文数据。<br>";
} else {
echo "插入失败: " . $mysqli->error . "<br>";
}
// 测试从数据库读取数据
$result = $mysqli->query("SELECT content FROM test_table ORDER BY id DESC LIMIT 1");
if ($result) {
$row = $result->fetch_assoc();
echo "读取到的内容: " . $row['content'] . "<br>";
} else {
echo "查询失败: " . $mysqli->error . "<br>";
}
// 关闭连接
$mysqli->close();
?>
数据库表和字段字符集要一致
确保你的表和字段的字符集也是 utf8mb4,可以用如下 SQL 查看:
SHOW CREATE TABLE test_table;
如果不是,可以通过 ALTER TABLE 改为一致的字符集。
测试页面编码
确保你的 PHP 页面本身是用 UTF-8 编码保存的,并且 HTTP 响应头中声明了正确的 Content-Type:
header('Content-Type: text/html; charset=utf-8');
使用 mysqli_report 方便调试
开发中可以启用 MySQLi 报告功能,方便捕捉到隐藏的错误:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);