2015-02-09 84 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'); 

,希望能解决任何你遇到的问题。