php json_encode utf8 char问题(mysql)

时间:2011-01-24 13:08:05

标签: php mysql utf-8 json

我使用jQuery json_encode的表单中的数据形式写入数据库。

但是,数据库中的数据会损坏。

$db->query("SET NAMES utf8");

$kelime = array("Merhaba","Dünya");
$bilgi = json_encode($kelime);

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '".$bilgi."'
";
$db->query($incelemeEkle);

数据库表架构;

CREATE TABLE `incelemeRapor` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bigData` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

MySQL插入示例数据;

["Merhaba","Du00fcnya"]

5 个答案:

答案 0 :(得分:25)

在将数据放入SQL查询之前始终转义数据:

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '".mysql_real_escape_string($bilgi)."'
";

(已添加mysql_real_escape_string()来电)

json_encode()使用\u<code-point>表示法编码非ascii字符;因此json_encode(array("Merhaba","Dünya"));会返回["Merhaba","D\u00fcnya"]

然后这个字符串嵌入在SQL查询中:

INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\u00fcnya"]'

转义序列\u没有特殊含义,因此MySQL只删除了\;这导致["Merhaba","Du00fcnya"]存储在数据库中。

因此,如果您转义字符串,查询将变为:

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\\u00fcnya"]'
";

["Merhaba","D\u00fcnya"]存储在数据库中。

答案 1 :(得分:1)

因此,除了确保您的数据库使用utf8_unicode_ci之外,您还需要确保PHP使用正确的编码。通常,我在任何可能在其中包含外来字符的函数的顶部运行以下两个命令。更好的方法是在应用程序启动时将其作为第一个命令之一运行:

mb_language('uni');
mb_internal_encoding('UTF-8');

这两行让我头疼不已!

答案 2 :(得分:0)

与user576875一样,您只需要在将字符串插入数据库之前正确处理它。 mysql_real_escape_string()是实现这一目标的一种方式。准备好的陈述是另一种方式。如果您将用户输入直接写入SQL,这也可以避免您可能容易受到的SQL注入安全问题。始终使用以上两种方法之一。

另外,请注意,这与UTF8没什么关系。 JSON是ASCII安全的,因此只要您使用类似ASCII的字符集(utf8,iso-8859-1),数据就会被正确插入和存储。

答案 3 :(得分:0)

我尝试使用mysql_real_escape_string()但不适用于我(结果为数据库中的空字段)。

所以我看了一下:http://php.net/manual/fr/json.constants.php并且标志 JSON_UNESCAPED_UNICODE 对我很有用:

$json_data = json_encode($data,JSON_UNESCAPED_UNICODE);

JSON_UNESCAPED_UNICODE仅在PHP 5.4.0之后可用!

答案 4 :(得分:-1)

我会将BASE64编码应用于JSON字符串。这应该适用于几乎每个php设置,数据库,数据库版本和设置:

$values = array("Test" => 1, "the" => 2, "West" => 3);
$encoded = base64_encode(json_encode($values));
$decoded = json_decode(base64_decode($encoded), true);