php json_编码utf8字符问题(mysql)

php json_编码utf8字符问题(mysql),php,mysql,utf-8,json,Php,Mysql,Utf 8,Json,我正在使用jQuery以表单中的数据形式写入数据库 但是,数据库中的数据将损坏 $db->query("SET NAMES utf8"); $kelime = array("Merhaba","Dünya"); $bilgi = json_encode($kelime); $incelemeEkle = " INSERT INTO incelemeRapor SET bigData = '".$bilgi."' "; $db->query($incelemeEkle); 数据库

我正在使用jQuery以表单中的数据形式写入数据库

但是,数据库中的数据将损坏

$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"]

在将数据放入SQL查询之前,请始终对其进行转义:

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '".mysql_real_escape_string($bilgi)."'
";
INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\u00fcnya"]'
(添加了
mysql\u real\u escape\u string()
call)

json\u encode()
使用
\u
符号对非ascii字符进行编码;所以
json_编码(数组(“Merhaba”,“Dünya”)返回
[“Merhaba”,“D\u00fcnya”]

然后,此字符串嵌入到SQL查询中:

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '".mysql_real_escape_string($bilgi)."'
";
INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\u00fcnya"]'
转义序列
\u
没有特殊意义,因此MySQL只删除
\
;这导致数据库中存储了
[“Merhaba”,“Du00fcnya”]

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

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

并且
[“Merhaba”,“D\u00fcnya”]
存储在数据库中。

我将对JSON字符串应用BASE64编码。这几乎适用于所有php设置、数据库、数据库版本和设置:

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

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

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

这两行字让我省去了很多麻烦

正如user576875所说,在将字符串插入数据库之前,只需正确处理字符串<代码>mysql\u real\u escape\u string()
是一种方法。准备好的声明是另一种方式。这还将使您避免SQL注入安全问题,如果您将用户输入直接写入SQL中,您可能会受到此问题的影响。始终使用上述两种方法之一


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

我尝试使用mysql\u real\u escape\u string()但不适用于我(数据库中的结果为空字段)

所以我看了这里:这个标志JSON\u UNESCAPED\u UNICODE对我很有用:

$json_data = json_encode($data,JSON_UNESCAPED_UNICODE);

JSON_UNESCAPED_UNICODE仅在PHP5.4.0之后才可用

实际的PHP文件保存为什么编码?根据MySQL文档,当使用集合名称时,字符集被括在引号中,您似乎没有,所以您可能没有实际设置utf8。@Jamie Taniguchi:不,可以这样使用,您不需要对JSON进行base64编码。它是安全的。只有7位字符。你说得对。但是base64编码避免了反斜杠(或其他特殊字符)的任何问题