php json_encode utf8 char problem ( mysql )

2022-08-31 00:49:29

我正在以数据的形式从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"]

答案 1

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

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

(添加呼叫)mysql_real_escape_string()

json_encode()用符号编码非 ascii 字符;所以返回.\u<code-point>json_encode(array("Merhaba","Dünya"));["Merhaba","D\u00fcnya"]

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

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

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

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

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

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


答案 2

我尝试使用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 之后可用!


推荐