将 CSV 中的中文字符插入 MySQL 时遇到问题

Posted

技术标签:

【中文标题】将 CSV 中的中文字符插入 MySQL 时遇到问题【英文标题】:Trouble inserting Chinese characters from a CSV into MySQL 【发布时间】:2017-10-01 21:32:04 【问题描述】:

我正在尝试编写一个循环通过 CSV 并将值从 CSV 插入 mysql 表的 php 脚本。这些字符在 CSV 中看起来很好,但是当我将它们插入数据库时​​,它们显示为ç‹‚å¹² 和变体。

我将 PDO 连接设置为 UTF-8 字符集,表本身设置为 UTF-8,当我转储字符时,它们显示为正确的汉字,只要我设置 UTF-8标题。但是,它们在插入时会变得很不稳定,并且在选择它们退出时仍然如此。如果我使用 GUI (Navicat) 插入特定的短语,它会很好地选择出来。

$mysql = new PDO('mysql:host=1.2.3.4;dbname=db;charset=UTF-8', 'username', 'password');

header('Content-type: text/html; charset=utf-8');

$handle = fopen('bannedWords.csv', 'r');
$count = 0;
$word = '';
$insert = $mysql->prepare("INSERT INTO sensitivePhrases SET phrase = :word");
$insert->bindParam(':word', $word);
while (($data = fgetcsv($handle)) !== false) 
    $word = $data[1];
    var_dump($word);
    $insert->execute();

我尝试过使用uft8_encodeutf8_decode 以及mb_convert_encoding,但都没有帮助。我想要一些关于我哪里出错的建议。

【问题讨论】:

【参考方案1】:

不要使用任何形式的编码/解码功能。

不要一次读一行;改为使用LOAD DATA ... CHARACTER SET = utf8mb4 ...;

如果新架构的数据排列不正确,请在 LOAD 语句中使用 @variables 或加载到 tmp 表中,然后进行一些转换。

同时,您不应该需要在任何地方转换字符;只需在任何地方指定正确的字符集。

如果你有更多的麻烦,让我们看看一些字符的十六进制(连同你所期望的)。让我们看看LOAD ...SHOW CREATE TABLE

【讨论】:

【参考方案2】:

在您的 MySQL 中,您需要指定 utf8mb4,因为虽然 UTF-8 在宇宙的其余部分是一个 4 字节索引,但在 MySQL 中它只是一个 3 字节索引,所以只显示所有 UTF 的一小部分-8 个字符。

$mysql = new PDO('mysql:host=1.2.3.4;dbname=db;charset=utf8mb4', 'username', 'password');

您需要将utf8mb4 应用于您的连接以及您的目标表。

阅读优秀StackOveflow post about UTF-8 here

【讨论】:

很抱歉;我意识到我可能没有在我的连接中尝试过,我会在尝试后再次回复。 成功!我一定没有在我的连接中添加它!成功了! 是的,对不起,昨晚由于某种原因没有让我检查;再次感谢!

以上是关于将 CSV 中的中文字符插入 MySQL 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

从 sql 文件或使用 csv 文件将数据插入 mysql

自动将 csv 文件插入 mysql 表

如何将字符串值从 .csv 插入 SQLite 数据库? Qt C++

将 CSV 插入 mysql

将csv中的行插入到mysql数据库中

将 jQuery datepicker 插入 MySQL 时遇到问题