2017-05-03 73 views
0

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

我把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,没有一个是有帮助试过。我很想知道我要去哪里的错误。

回答

2

在您的MySQL中,您需要指定utf8mb4,因为虽然Universe的其余部分中的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

+0

对不起,我意识到我可能没有在我的连接尝试它,并会尝试后再次作出响应。 – RhoVisions

+0

成功!我一定没有把它添加到我的连接中!有效! – RhoVisions

+0

耶,对不起,昨晚它不让我检查一下原因;再次感谢! – RhoVisions

0

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

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

如果数据未针对新架构进行正确排列,则可以在LOAD语句内使用@variables进行摆弄或加载到tmp表中,然后执行一些转换。

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

如果您有更多麻烦,让我们看看一些字符的十六进制(以及您的期望)。我们来看看LOAD ...SHOW CREATE TABLE