2015-02-09 170 views
0

我試圖通過PHP將一些數據插入到表中,但像Æ和Ð這樣的冰島字符似乎並未正確傳輸到MySQL。我有一個使用mysqli傳輸數據到MySQL的PHP​​腳本,我在文件(mysqli-> query(「SET NAMES'utf-8')中有set_charset('utf-8'))也不工作)MySQL,PHP和utf8

數據庫,表格及行都有整理UTF8,Unicode的CI

如果我更新的phpmyadmin內的數據,然後自動曝光和d出來正確但如果它使用我的腳本是。:

$stmt = $conn->prepare("UPDATE filters SET filter_nr = ?, filter_maker = ?, color = ?, bold = ? WHERE id = ?"); 
if (false === $stmt) 
    error_log("connection failed: ". $conn->error); 
else 
    { 
     if ($newline["filter_nr"] === "MP") 
      error_log(mb_detect_encoding($newline["filter_maker"])); 
     $bold = (int) $newline["bold"]; 
     $id = (int) $newline["id"]; 
     $fnr = $newline["filter_nr"]; 
     $fmaker = Encoding::fixUTF8($newline["filter_maker"]); 
     $color = $newline["color"]; 
     header('Content-Type: text/html; charset=utf-8'); 
     $stmt->bind_param("sssii", $fnr, $fmaker, $color, $bold, $id); 
     $stmt->execute();enter code here 

該數據似乎包含Æ和Ð罰款到這裏(至少他們表明你p在XMLHttpRequest日誌中的chromes devtools中很好)但是一旦它們進入數據庫,Æ和Ð就會被加擾。

我測試了數據庫中的十六進制值,它們是不同的。來自我的PHP腳本的數據編碼爲C383E280A0(在瀏覽器中顯示爲×),但來自phpmyadmin的數據編碼爲C386,在瀏覽器中顯示爲Æ。

+0

感謝Dagon,使用utf8mb4做到了。 – ojs 2015-02-09 01:35:29

+0

MySQL charset被稱爲「utf8」,而不是「utf-8」(不包括引號和短劃線)。 – deceze 2015-02-09 01:41:48

回答

0

允許用戶輸入UTF-8是一個兩階段過程。 首先,設置PHP的DEFAULT_CHARSET爲UTF-8:

default_charset = "utf-8"; 

這確保PHP在HTML響應發送將指示瀏覽器解釋頁面內容爲UTF-8編碼的Content-Type頭。

爲了確保用戶輸入實際上是UTF-8,不過,即使瀏覽器都盲目地假定這將是UTF-8,有必要使用PHP的mbstring擴展:

mb_internal_encoding('UTF-8'); 

,希望能解決任何你遇到的問題。