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


how to remove back slashes from mysql dump table while importing in 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');

所以请提出任何解决方案。提前感谢....!!!!!

您需要通过加倍来转义这些斜杠:

插入引线 (921347,空,'李的 ...

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

就个人而言,我不将使用sql转储文件来迁移数据,除了这种问题之外,它们太慢了。最好使用Navicat''Toad''Heidi之类的东西来做。Navicat 是最好的,但您必须付费,而其他人是免费的。

尝试:

shell> mysqldump --tab=/tmp yourdatabase

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

COPY country FROM '/tmp/yourtable';

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

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

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

如果在带引号的字符串之前添加 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' ,'并运行 INSERT 语句

例如:我用你的语句创建了一个文件,并记录了所有出现的情况:

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');