2014-12-19 2 views
2

Мы пытаемся извлечь данные из MS SQL Server с помощью драйвера FreeTDS для PDO и вставляем его в таблицу MySQL. Тем не менее, кажется, что одна запись заполняется правильными данными, за которой следует строка нежелательных символов и даже других запросов. Мы смогли выполнить репликацию, повторно импортировав одну и ту же запись, и каждый раз, когда она включала разные данные мусора.Ошибка ввода в 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. Поскольку, похоже, вы пытаетесь вставить некоторые нечитаемые данные, может возникнуть проблема с памятью, когда данные возвращаются из какой-либо случайной ячейки памяти? Или есть коррупция памяти?

+1

Мы не можем помочь вам, если вы не указали свой код. – Barmar

+2

Не могли бы вы предоставить некоторые примеры данных, которые вызывают коррупцию и запросы? – ydoow

+0

Не уверен, но, возможно, вам нужно включить круглые скобки вокруг значений. Я никогда не видел этого без: 'INSERT INTO Items (ItemName) VALUES ('gat43C4533')' – Robbert

ответ

0

Так я узнал, что этот вопрос.

Персонаж вызывает ошибку была кириллица C.

соединение PDO с MySQL не указать кодировку UTF-8, поэтому я добавил:

$PDOconnection->exec("set names utf8"); 

Это позволило специальный символ, который будет вставлен без проблем.

Случайные данные SQL и нежелательные сообщения, которые отображались в терминале, вероятно, были вызваны символом EOT во вставленной строке.

1

попробуйте использовать это, чтобы очистить строку перед вставкой. он удалит специальные символы, которые нельзя увидеть, пример \ п

function clean($string) { 
    $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. 

    return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. 
} 
+0

Спасибо за предложение. Тем не менее, имена элементов могут содержать в себе не альфа-числовые символы, включая пробелы, тире и даже вопросительные знаки (это странно правильно ?!). В идеале, мне нужно что-то, чтобы не допустить, чтобы какие-либо символы, не подлежащие декодированию, не-utf-8. –

+0

Возможно, это тогда - http://php.net/manual/en/function.iconv.php – clonerworks

+0

Мы проверим это сегодня. Благодарю. –

Смежные вопросы