MySQL / PDO schneidet die Daten ab
$book
ist eine 7kb-Zeichenfolge. Wenn diese Abfrage mit PHP PDO ausgeführt wirdexec
, dasmonograph
Spaltendaten (LONGTEXT) werden bei 6765 Zeichen abgeschnitten:
echo strlen($book); // output 7157
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");
Wenn ich die Abfrage jedoch drucke und sie mit dem SQL-Client ausführe (unter Umgehung von PHP), werden alle Daten in die Datenbank eingefügt. Das lässt mich denken, dass es sich um eine PHP-Einstellung handelt, mit der ich noch nicht vertraut bin.
Beachten Sie, dass das gleiche passiert, wenn ich vorbereitete Anweisungen verwende (inkl. Mit PDO :: PARAM_LOB).
$book
zuvor gedumpter Wertexec
https://gist.github.com/79d5fe1050bbb0e2fac8 (7157). Die tatsächlichen Daten, die in der Datenbank landenhttps://gist.github.com/df49d4a9707660b8b60b (6765). Ich verstehe nicht, wie eine solche Datenkürzung technisch möglich ist, da die gesamte Abfrage an MySQL übergeben wird (andernfalls würde ein SQL-Syntaxfehler auftreten).
echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";
Wenn ich die Ausgabe (https://gist.github.com/a05fe4c033e74897b82b) mithilfe eines SQL-Clients ausführe, werden diese Daten in der Datenbank gespeicherthttps://gist.github.com/88870fe26a3ae40e991e (7157, erwartet).
PDO wird über eine UTF8-Verbindung initiiert.
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
Jetzt weiß ich, dass das Codierungsproblem ist.
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");
Ich bin mir jedoch nicht ganz sicher, was ich dagegen tun soll. Meine Verbindung zu MySQL ist bereits Unicode.
/etc/my.cnf
ist so konfiguriert, dass die folgenden Einstellungen serverweit verwendet werden.
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci