如何在postgreSQL中导入时从mysql转储表中删除反斜杠

时间:2015-03-11 13:52:52

标签: php mysql database postgresql

在将数据库从MYSQL迁移到postgrSQL期间,我遇到了反斜杠()问题。 我的问题是我有很多大的mysql表转储(使用sql formate)大约2gb并尝试在postgreSQL数据库中导入。在mysql转储文件中,许多列中有许多反斜杠,所以如果我尝试在postgreSQL中导入它通过异常。我尝试了很多解决方案,但还没有成功。 并且mysql转储文件非常大,所以我无法手动设置它。 你可以看到下面的mysql代码。

MYSQL代码:

INSERT INTO Leads 
(921347,NULL,'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');

所以请建议任何解决方案。提前致谢....!!!!!!

4 个答案:

答案 0 :(得分:1)

你需要通过加倍来逃避这些斜线:

INSERT INTO Leads(921347,NULL,'Lee \'s ...

您如何做到这一点取决于您可以使用的工具。如果您没有可以搜索和替换的编辑器,那么您可以编写php脚本并使用preg_replace处理该文件。

我个人不会使用sql dump文件来迁移数据,除了这类问题,它们太慢了。使用Navicat \ Toad \ Heidi之类的东西要好得多。 Navicat是最好的,但你必须为此付费,而其他人则是免费的。

答案 1 :(得分:0)

如果在引用的字符串之前添加E,它将运行,如

INSERT INTO Leads (921347,NULL,'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');

将成为

INSERT INTO Leads (921347,NULL,e'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');

您可以将所有,' sed为,e'并运行插入语句

例如:我用你的陈述创建了一个文件,并且sed所有出现的事件:

cat mysql.sql
INSERT INTO Leads (921347,NULL,'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');
INSERT INTO Leads (921347,NULL,'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');
sed -i.bak s/,'/,e'/g mysql.sql
cat mysql.sql
INSERT INTO Leads (921347,eNULL,e'Lee\'s Summit',e'MO',e'64081',e'1983-09-24',eNULL,e'75.81.43.181',eNULL,e0,e'cash');
INSERT INTO Leads (921347,eNULL,e'Lee\'s Summit',e'MO',e'64081',e'1983-09-24',eNULL,e'75.81.43.181',eNULL,e0,e'cash');
cat mysql.sql.bak
INSERT INTO Leads (921347,NULL,'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');
INSERT INTO Leads (921347,NULL,'Lee\'s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');

所以你有.bak的原始和mysql.sql转换为postgres ...

更新2: 您可以使用Oracle样式更改并非所有带引号的字符串,而只是更改引号:

sed -e "s/\\\\'/''/g" mysql.sql
INSERT INTO Leads (921347,NULL,'Lee''s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');
INSERT INTO Leads (921347,NULL,'Lee''s Summit','MO','64081','1983-09-24',NULL,'75.81.43.181',NULL,0,'cash');

答案 2 :(得分:0)

尝试:

shell> mysqldump --tab=/tmp yourdatabase

然后对于每个表使用http://www.postgresql.org/docs/8.1/static/sql-copy.html

COPY country FROM '/tmp/yourtable';

答案 3 :(得分:0)

因为对于大型数据库没有简单的解决方案,请阅读以下wikibook:

将MySQL转换为PostgreSQL http://en.wikibooks.org/wiki/Converting_MySQL_to_PostgreSQL

在那里您可以找到如何迁移转储文件的示例或使用CSV文件而不是转储文件的建议。