我们正在尝试使用FreeTDS驱动程序从PDO中提取数据并将其插入MySQL表。但是,似乎正在使用正确的数据填充一条记录,然后是一串垃圾字符,甚至是其他查询的部分。我们能够通过重新导入相同的记录进行复制,每次都包含不同的垃圾数据。
还有其他人遇到过这种奇怪的行为吗?什么可能导致这种情况?
代码基本归结为从SQL Server中选择NVARCHAR字段并将其插入MySQL中的VARCHAR字段。例如:
SQL Server:
SELECT ItemName FROM Items;
返回' gat43C4533'
MySQL的:
INSERT INTO Items (ItemName) VALUES ('gat43C4533');
MySQL表中的结果是
gat43?4533 -*[$%^&^%#$^%&] . CASE WHEN GHYT.Test...
有没有什么方法可以抛出某种类型的错误或优雅地处理它而不用垃圾填充字段?
这有可能是MySQL或FreeTDS中的错误吗?没有人解决随机SQL代码出现的问题。由于它似乎试图插入一些不可读的数据,是否存在一些内存问题,其中数据是从某个随机内存位置返回的?还是存在内存损坏?
答案 0 :(得分:1)
在插入之前尝试使用它来清理字符串。 它将删除无法看到的特殊字符,例如\ n
function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}
答案 1 :(得分:0)
所以我发现了问题所在。
导致错误的字符是Cyrillic C。
与MySQL的PDO连接未指定UTF-8编码,因此我添加了:
$PDOconnection->exec("set names utf8");
这允许插入特殊字符而不会出现问题。
终端中显示的随机SQL和垃圾数据可能是由于EOT字符位于插入的字符串中。