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);