MySQL / PDO trunca os dados
$book
é uma string de 7kb. Se esta consulta for executada usando o PHP PDOexec
, amonograph
os dados da coluna (LONGTEXT) são truncados em 6765 caracteres:
echo strlen($book); // output 7157
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");
No entanto, se eu imprimir a consulta e executá-lo usando o cliente SQL (ignorando o PHP), ele inserirá todos os dados no banco de dados. O que me faz pensar que é a configuração do PHP que ainda não estou familiarizado.
Note que o mesmo está acontecendo se eu usar instruções preparadas (incl. Com PDO :: PARAM_LOB).
$book
valor despejado antesexec
https://gist.github.com/79d5fe1050bbb0e2fac8 (7157). Os dados reais que terminam no banco de dadoshttps://gist.github.com/df49d4a9707660b8b60b (6765). Eu não entendo como esse truncamento de dados é tecnicamente possível, já que toda a consulta é passada para o MySQL (caso contrário, o erro de sintaxe SQL apareceria).
echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";
Se eu executar a saída (https://gist.github.com/a05fe4c033e74897b82b) usando o cliente SQL, esses são os dados que terminam no banco de dadoshttps://gist.github.com/88870fe26a3ae40e991e (7157, esperado).
O PDO é iniciado usando a conexão UTF8.
new PDO('mysql:dbname=[..];host=localhost;charset=utf8', 'root', '[..]', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';"));
ATUALIZAÇÃO 2012 07 25 04:11 EST
Agora eu sei que é problema de codificação.
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");
No entanto, não tenho certeza do que fazer sobre isso. Minha conexão com o MySQL já é unicode.
/etc/my.cnf
está configurado para usar as seguintes configurações em todo o servidor.
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci