将 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_encode
和utf8_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 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章