Мы пытаемся извлечь данные из MS SQL Server с помощью драйвера FreeTDS для PDO и вставить их в таблицу MySQL. Однако, кажется, что одна запись заполняется правильными данными, за которыми следует строка ненужных символов и даже части других запросов. Мы смогли выполнить репликацию, повторно импортировав одну и ту же запись, и каждый раз она включала разные ненужные данные.
Кто-нибудь еще сталкивался с таким странным поведением? Что может вызвать это?
Код в основном сводится к выбору полей NVARCHAR из SQL Server и вставке его в поля VARCHAR в MySQL. Например:
SQL Server:
SELECT ItemName FROM Items;
возвращает ‘gat43C4533’
MySQL:
INSERT INTO Items (ItemName) VALUES ('gat43C4533');
результат в таблице MySQL
gat43?4533 -*[$%^&^%#$^%&] . CASE WHEN GHYT.Test...
Есть ли способ, которым PDO может выдать какой-либо тип ошибки или изящно обработать это, не заполняя поле ненужным?
Есть ли способ, которым это может быть ошибка в MySQL или FreeTDS? Никто не учел тот факт, что появляется случайный код SQL. Поскольку кажется, что он пытается вставить некоторые нечитаемые данные, может ли быть какая-то проблема с памятью, когда данные возвращаются из некоторой случайной области памяти? Или есть повреждение памяти?
попробуйте использовать это, чтобы очистить строку перед вставкой.
он удалит специальные символы, которые невозможно увидеть, например \ n
function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}
Итак, я выяснил, в чем проблема.
Символ, вызвавший ошибку, был кириллицей C.
Соединение PDO с MySQL не указывало кодировку UTF-8, поэтому я добавил:
$PDOconnection->exec("set names utf8");
Это позволило добавить специальный символ без проблем.
Случайные данные SQL и ненужные данные, которые отображались в терминале, вероятно, были вызваны тем, что во вставленной строке был символ EOT.