Php json_encode utf8 char проблема (mysql)

Я пишу в базу данных в виде данных из формы с помощью 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"]'

Для escape-последовательности \u нет специального значения, поэтому MySQL просто удаляет \; и это приводит к сохранению ["Merhaba","Du00fcnya"] в базе данных.

Итак, если вы избежите строки, запрос будет выглядеть следующим образом:

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

И ["Merhaba","D\u00fcnya"] хранится в базе данных.

Ответ 2

Таким образом, помимо того, что ваша база данных использует utf8_unicode_ci, вы также хотите убедиться, что PHP использует правильную кодировку. Обычно я запускаю следующие две команды в верхней части любой функции, которая потенциально может содержать в себе инородные символы. Еще лучше запустить его как одну из первых команд при запуске приложения:

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

Эти две линии спасли мне массу головных болей!

Ответ 3

Как и user576875, вам просто нужно правильно обработать свою строку перед ее вставкой в ​​базу данных. mysql_real_escape_string() - это один из способов сделать это. Подготовленные заявления - это еще один способ. Это также избавит вас от проблемы безопасности SQL-инъекции, которая может быть восприимчивой к тому, если вы введете пользовательский ввод непосредственно в SQL. Всегда используйте один из двух методов.

Также обратите внимание, что это имеет мало общего с UTF8. JSON является ASCII безопасным, поэтому пока вы используете набор символов ASCII (utf8, iso-8859-1), данные будут вставлены и сохранены правильно.

Ответ 4

Я попытался с 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!

Ответ 5

Я бы применил кодировку BASE64 к строке JSON. Это должно работать почти с каждой настройкой php, базой данных, версией базы данных и настройкой:

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