MySQL / PDO усекает данные
$book
является строкой 7 КБ Если этот запрос выполняется с использованием PHP PDOexec
,monograph
данные столбца (LONGTEXT) усекаются до 6765 символов:
echo strlen($book); // output 7157
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");
Однако, если я распечатываю запрос и выполняю его с помощью клиента SQL (в обход PHP), он вставляет все данные в базу данных. Что заставляет меня думать, что это настройка PHP, с которой я еще не знаком.
Обратите внимание, что то же самое происходит, если я использую подготовленные операторы (в том числе с PDO :: PARAM_LOB).
$book
значение сбрасывается доexec
https://gist.github.com/79d5fe1050bbb0e2fac8 (7157). Фактические данные, которые попадают в базу данныхhttps://gist.github.com/df49d4a9707660b8b60b (6765). Я не понимаю, как такое усечение данных технически возможно, поскольку весь запрос передается в MySQL (в противном случае возникнет ошибка синтаксиса SQL).
echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";
Если я выполню вывод (https://gist.github.com/a05fe4c033e74897b82b) с помощью клиента SQL, это данные, которые попадают в базу данныхhttps://gist.github.com/88870fe26a3ae40e991e (Ожидается 7157).
PDO инициируется с использованием соединения UTF8.
new PDO('mysql:dbname=[..];host=localhost;charset=utf8', 'root', '[..]', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';"));
UPDATE 2012 07 25 04:11 EST
Теперь я знаю, что это проблема кодирования.
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");
Однако я не уверен, что с этим делать. Мое соединение с MySQL уже Unicode.
/etc/my.cnf
настроен на использование следующих настроек для всего сервера.
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci