我正在尝试将表从一个数据库复制到另一个数据库(NOT模式)。我在终端中使用的代码如下:
pg_dump -U postgres -t OldSchema.TableToCopy OldDatabase | psql -U postgres -d NewDatabase
当我按Enter键请求postgres密码我输入我的通行证然后它请求psql密码。我输入它然后按Enter键。我收到很多:
invalid command \N
ERROR: relation "TableToCopy" does not exist
两个表都有 UTF8 编码。我做错了吗? 操作系统:Windows XP
错误输出:
psql:TblToCopy.sql:39236: invalid command \N
psql:TblToCopy.sql:39237: invalid command \N
psql:TblToCopy.sql:39238: invalid command \N
.
.
.
在上述数百个错误之后,终端回应:
psql:TblToCopy.sql:39245: ERROR: syntax error at or near "509"
LINE 1: 509 some gibberish words and letters here
最后:
sql:TblToCopy.sql:39245: ERROR: relation "TableToCopy" does not exist
修改 我读到了对同一个问题\N error with psql的回复,它说要使用INSERT而不是COPY,但是在文件pg_dump中创建了COPY。怎么说pg_dump使用INSERT而不是COPY?
我用iconv将文件转换为utf-8。现在错误已经消失,但我有一个新错误。在这种特殊情况下,当我使用psql将数据导入数据库时会发生新的事情。表已创建但没有数据。它说:
SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
psql:tblNew.sql:39610: ERROR: value too long for type character(3)
CONTEXT: COPY words, line 1, column first_two_letters: "سر"
ALTER TABLE
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE TRIGGER
答案 0 :(得分:2)
应引用表名,如下所示
pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase | psql -U postgres -d NewDatabase
我建议你分两步完成这项工作
第1步
pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase > Table.sql
如果步骤1正常,则执行步骤2。
第2步
psql -U postgres -d NewDatabase -f Table.sql
答案 1 :(得分:2)
我尝试使用Encoding:UTF8创建一个带有表的数据库,并插入COPY命令试图插入的两个UTF-8编码字符,并且在使用INSERT时它可以正常工作。
CREATE DATABASE test
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'English_United States.1252'
LC_CTYPE = 'English_United States.1252'
CONNECTION LIMIT = -1;
CREATE TABLE x
(
first_two_letters character(3)
)
WITH (
OIDS=FALSE
);
ALTER TABLE x
OWNER TO postgres;
INSERT INTO x(
first_two_letters)
VALUES ('سر');
根据http://rishida.net/tools/conversion/对于失败的COPY,Unicode代码点是:
U + 0633 U + 0631
两个字符,这意味着您应该能够将它们存储在定义为字符(3)的列中,该列存储长度最多为3个字符(不是字节)的字符串。
如果我们尝试INSERT,它会成功:
INSERT INTO x(
first_two_letters)
VALUES (U&'\0633\0631');
使用--inserts选项从pgdump documentation可以INSERT而不是COPY
- 插入 将数据转储为INSERT命令(而不是COPY)。这将使恢复非常缓慢;它主要用于制作可以转储的转储 被加载到非PostgreSQL数据库中。但是,自从这个选项 为每一行生成一个单独的命令,重新加载一行时出错 导致只丢失该行而不是整个表内容。 请注意,如果重新排列,恢复可能会完全失败 列顺序。 --column-inserts选项对列顺序是安全的 变化,但更慢。
尝试使用此代替步骤1:
pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql
我还尝试从表格复制到文件并使用COPY导入,对我来说它有效。
您确定您的客户端和服务器数据库编码是UTF8吗?
首先,将名为“x”的表从数据库“test”上的模式“public”导出到纯文本SQL文件:
pg_dump -U postgres -t public."x" test > x.sql
创建包含以下内容的x.sql文件:
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET search_path = public, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: x; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE x (
first_two_letters character(3)
);
ALTER TABLE public.x OWNER TO postgres;
--
-- Data for Name: x; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY x (first_two_letters) FROM stdin;
سر
\.
--
-- PostgreSQL database dump complete
--
其次,导入:
psql -U postgres -d test -f x.sql