MySQL / PDO obcina dane
$book
jest ciągiem 7 kb. Jeśli to zapytanie jest wykonywane przy użyciu PHP PDOexec
, themonograph
Dane kolumny (LONGTEXT) zostają obcięte przy znaku 6765:
echo strlen($book); // output 7157
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");
Jeśli jednak wydrukuję zapytanie i wykonam je przy użyciu klienta SQL (pomijając PHP), wstawi on wszystkie dane do bazy danych. Co sprawia, że myślę, że to ustawienie PHP nie jest mi jeszcze znane.
Zauważ, że dzieje się tak, jeśli używam przygotowanych instrukcji (w tym z PDO :: PARAM_LOB).
$book
wartość zrzucona wcześniejexec
https://gist.github.com/79d5fe1050bbb0e2fac8 (7157). Rzeczywiste dane, które trafiają do bazy danychhttps://gist.github.com/df49d4a9707660b8b60b (6765). Nie rozumiem, w jaki sposób takie obcięcie danych jest technicznie możliwe, ponieważ całe zapytanie jest przekazywane do MySQL (inaczej wystąpiłby błąd składniowy SQL).
echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";
Jeśli wykonam dane wyjściowe (https://gist.github.com/a05fe4c033e74897b82b) przy użyciu klienta SQL, są to dane, które trafiają do bazy danychhttps://gist.github.com/88870fe26a3ae40e991e (7157, oczekiwane).
PDO jest inicjowane przy użyciu połączenia 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
Teraz wiem, że to kwestia kodowania.
$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");
Nie jestem jednak pewien, co z tym zrobić. Moje połączenie z MySQL jest już Unicode.
/etc/my.cnf
jest skonfigurowany do używania następujących ustawień w całym serwerze.
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci