2017-05-03 40 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

相關問題