Съгласно PHP/PDO/MySQL :вмъкването в MEDIUMBLOB съхранява лоши данни , опитайте да използвате следния ред, за да създадете своя PDO обект:
$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES latin1 COLLATE latin1_general_ci"));
Обяснение
Мисля, че, както отбелязва Бен М в свързания въпрос, тук работят две лоши дизайнерски решения.
Има тази концепция за набор от знаци за връзка. Идеята е, че SQL текстът може да бъде във всеки набор от знаци и след това да се преобразува при извличане от SQL сървъра.
Това не работи толкова добре с двоични данни, тъй като не е текст и следователно не трябва, по дефиниция, да бъде в нито един набор от знаци, но все пак се прехвърля с помощта на низови литерали .
Този проблем може да бъде заобиколен чрез цитиране на BLOB данни по време на трансфер (или с помощта на функциите BASE64_* или чрез hex-escaping ) и наистина много хора правят това.
Второто дизайнерско решение е в PDO/PHP:PDO не извършва преобразуване на набор от знаци (не може, тъй като низовете в PHP по своята същност са независими от знаци), така че PHP е единственият (или един от малкото езици), където изборът на SQL наборът от знаци за трансфер е всъщност важен, защото трябва да съответства на кодирането, в което всъщност се намират входните низове.
На други езици, наборът от знаци за прехвърляне трябва да бъде достатъчно изразителен, за да обхваща всички знаци, които могат да се използват в низове. В днешния свят на емоджита това най-вероятно е гарантирано само от уникод знаци (utf-8 и други подобни). Въпреки това, нито едно от тях не е бинарно безопасно (че не всяка възможна комбинация от байтове дава валиден низ), така че дори и да можем да заобиколим проблема с PHP, пак ще останем с проблем №1.
В идеалния свят SQL командите винаги биха били в ASCII набора от знаци по време на прехвърляне и всяка стойност на низ ще има аргумент за набор от знаци, от който „двоичен“ може да бъде възможна стойност, предоставена с него. MySQL всъщност има такава конструкция за низове, която нарича „въвеждащ“. „_binary“ обаче изглежда не е валидна стойност.
Тази информация за набор от знаци след това ще бъде използвана от другия край за преобразуване на стойността на низа в нейния собствен набор от знаци (или колоната за прехвърляне от клиент към сървър, или набора от низове на езика за програмиране за трансфери от сървър към клиент).
По този начин единственото нещо, което би трябвало да бъде екранирано в BLOB стойностите, ще бъде разделителят на низове ("
или '
).