You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从CSV导入数据库时的波兰语字符编码异常问题

解决波兰语字符导入数据库乱码问题

乱码的核心原因是数据库连接未指定UTF-8字符集,加上代码存在SQL注入风险且未正确处理参数传递,导致特殊字符无法被数据库正确解析。按以下步骤修复:

1. 强制数据库连接使用UTF-8字符集

在建立数据库连接后,立即设置字符集为utf8mb4(兼容所有Unicode字符,包括波兰语特殊字符):

若使用mysqli:

// 假设$connect是你的mysqli连接实例
$connect->set_charset('utf8mb4');

若使用PDO:

在连接DSN中直接指定字符集:

$connect = new PDO(
    "mysql:host=你的主机名;dbname=你的数据库名;charset=utf8mb4",
    "用户名",
    "密码"
);

2. 修复SQL语句:用参数绑定替代字符串拼接

你的代码虽调用了prepare,但仍直接将变量拼入SQL,既存在注入风险,也易引发字符编码异常。改成参数绑定写法:

session_start();

$file_data = $_SESSION['file_data'];
unset($_SESSION['file_data']);

// 确保连接已设置utf8mb4字符集(mysqli示例,PDO则在连接时配置)
$connect->set_charset('utf8mb4');

foreach ($file_data as $row) {
    $data = $row[$_POST["sku"]] ?? null;
    $title = $row[$_POST["title"]] ?? '';
    $lang_id = $row[$_POST["lang_id"]] ?? null;

    if ($data !== null) {
        // 使用占位符创建预处理语句
        $statement = $connect->prepare("UPDATE product_details SET title = ? WHERE sku = ? AND lang_id = ?");
        // 绑定参数:"ssi"对应字符串、字符串、整数(根据实际字段类型调整)
        $statement->bind_param("ssi", $title, $data, $lang_id);
        
        if (!$statement->execute()) {
            $error = '部分或全部数据更新失败';
        }
    }
}

echo $error ?? '数据更新成功';

3. 确认CSV读取环节的字符编码

虽然CSV保存为UTF-8,但如果读取时系统默认编码不符,可能导致转码异常。确保读取CSV的代码(未展示部分)明确使用UTF-8编码,例如:

// 示例:读取CSV时强制转成UTF-8
$row = fgetcsv($handle);
$row = array_map(function($item) {
    return mb_convert_encoding($item, 'UTF-8', '自动检测的原编码');
}, $row);

额外验证

确认product_details表的title字段字符集为utf8mb4,排序规则可选utf8mb4_polish_ci(适配波兰语排序)——你手动添加产品显示正常,这一步大概率无需调整。

内容的提问来源于stack exchange,提问作者Marcin Wierzycki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:20:46