Can't copy table to another database with pg_dump

久未见 提交于 2019-12-04 16:57:17

I've tried to create a database with Encoding: UTF8 with a table and insert the two UTF-8 encoded characters the COPY command is trying to insert and it works when using 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 ('سر');

According to http://rishida.net/tools/conversion/ for the failing COPY the Unicode code points are:

U+0633 U+0631

which are two characters, which means you should be able to store them in a column defined as character(3), which stores strings up to 3 characters (not bytes) in length.

and if we try to INSERT, it succeeds:

 INSERT INTO x( 
                first_two_letters) 
        VALUES (U&'\0633\0631');

From the pgdump documentation you can INSERT instead of COPY by using the --inserts option

--inserts Dump data as INSERT commands (rather than COPY). This will make restoration very slow; it is mainly useful for making dumps that can be loaded into non-PostgreSQL databases. However, since this option generates a separate command for each row, an error in reloading a row causes only that row to be lost rather than the entire table contents. Note that the restore might fail altogether if you have rearranged column order. The --column-inserts option is safe against column order changes, though even slower.

Try to use this instead for Step 1:

pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql

I've also tried to COPY from a table to a file and use COPY to import and for me it works.

Are you sure your client and server database encoding is UTF8 ?

Firstly, export the table named "x" from schema "public" on database "test" to a plain text SQL file:

pg_dump -U postgres -t public."x" test > x.sql

which creates the x.sql file that contains:

--
-- 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
--

Secondly, import with:
psql -U postgres -d test -f x.sql

The table name should be quoted , as the following

pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase | psql -U postgres -d NewDatabase

And I suggest you do the job in two steps

Step 1

pg_dump -U postgres -t OldSchema."TableToCopy" OldDatabase > Table.sql

If step 1 goes ok then do the step2.

Step 2

psql -U postgres -d NewDatabase -f Table.sql
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!