Windows导出SQL文件上传Plesk时的字符集异常问题求助
解决步骤
1. 修正数据库连接的字符集配置
不要用SET NAMES,改用mysqli原生的set_charset方法,确保连接字符集与数据库/表的字符集统一(推荐用utf8mb4,兼容所有UTF-8字符):
$mysqli = new mysqli('localhost', $user, $pass, $name); // 先检查连接错误 if ($mysqli->connect_error) { die('连接失败: ' . $mysqli->connect_error); } // 设置连接字符集为utf8mb4 $mysqli->set_charset('utf8mb4'); // 无需再调用select_db,new mysqli时已指定数据库
2. 移除错误的utf8_decode调用
utf8_decode()会把UTF-8字符串转成ISO-8859-1(即Notepad++显示的ANSI),这是导致乱码和文件编码错误的核心原因。直接输出原始UTF-8内容,并在HTTP头里明确编码:
header('Content-Type: text/plain; charset=utf-8'); // 明确告知浏览器内容是UTF-8编码 header("Content-Transfer-Encoding: Binary"); header('Content-disposition: attachment; filename="' . $filename . '"'); echo $content; // 直接输出,不要转码 exit();
3. 统一SQL表定义的字符集
生成CREATE TABLE语句时,把DEFAULT CHARSET=utf8改成DEFAULT CHARSET=utf8mb4,确保导入Plesk时,数据库用兼容的字符集存储数据:
CREATE TABLE `xxx` ( `id` int(11) NOT NULL AUTO_INCREMENT, `notes` mediumtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 验证导出结果
导出后用Notepad++打开文件,编码应显示为UTF-8,特殊字符“èéèàì”能正常显示,此时上传到Plesk就不会出现数据错误。
额外说明
- MySQL的
utf8实际是utf8mb3,仅支持3字节Unicode字符,而utf8mb4支持完整UTF-8(含4字节emoji等),统一用utf8mb4可避免多数编码兼容问题。 - HTTP头必须指定
charset=utf-8,否则浏览器/下载工具会默认用系统编码保存文件,导致编码不符。
内容的提问来源于stack exchange,提问作者Gianluca Demarinis
相关产品推荐
相关产品推荐

