php json_编码utf8字符问题(mysql)
我正在使用jQuery以表单中的数据形式写入数据库 但是,数据库中的数据将损坏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); 数据库
$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编码避免了反斜杠(或其他特殊字符)的任何问题