MySQL / PDO trunca los datos

$book es una cadena de 7kb. Si esta consulta se ejecuta utilizando PHP DOP.exec, lamonograph Los datos de la columna (LONGTEXT) se truncan en 6765 caracteres:

echo strlen($book); // output 7157

$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");

Sin embargo, si imprimo la consulta y la ejecuto utilizando el cliente SQL (sin pasar por PHP), inserta todos los datos en la base de datos. Lo que me hace pensar que es la configuración de PHP a la que todavía no estoy familiarizado.

Tenga en cuenta que sucede lo mismo si uso sentencias preparadas (incluido con DOP :: PARAM_LOB).

$book valor descargado antesexec https://gist.github.com/79d5fe1050bbb0e2fac8 (7157). Los datos reales que terminan en la base de datos.https://gist.github.com/df49d4a9707660b8b60b (6765). No entiendo cómo tal truncamiento de datos es técnicamente posible, ya que toda la consulta se pasa a MySQL (de lo contrario, aparecerá un error de sintaxis SQL).

echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";

Si ejecuto la salida (https://gist.github.com/a05fe4c033e74897b82b) utilizando el cliente SQL, estos son los datos que terminan en la base de datoshttps://gist.github.com/88870fe26a3ae40e991e (7157, esperado).

PDO se inicia utilizando la conexión UTF8.

new PDO('mysql:dbname=[..];host=localhost;charset=utf8', 'root', '[..]', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';"));

ACTUALIZACIÓN 2012 07 25 04:11 EST

Ahora sé que es un problema de codificación.

$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");

Sin embargo, no estoy tranquilo de qué hacer al respecto. Mi conexión a MySQL es unicode ya.

/etc/my.cnf está configurado para usar las siguientes configuraciones en todo el servidor.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Respuestas a la pregunta(2)

Su respuesta a la pregunta