PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Não é possível copiar a tabela para outro banco de dados com pg_dump


Eu tentei criar um banco de dados com Encoding:UTF8 com uma tabela e inserir os dois caracteres codificados em UTF-8 que o comando COPY está tentando inserir e funciona ao usar 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 ('سر');

De acordo com http://rishida.net/tools/conversion/ para a CÓPIA com falha, os pontos de código Unicode são:

que são dois caracteres , o que significa que você deve poder armazená-los em uma coluna definida como character(3), que armazena strings de até 3 caracteres (não bytes) de comprimento.

e se tentarmos INSERT, ele consegue:
 INSERT INTO x( 
                first_two_letters) 
        VALUES (U&'\0633\0631');

Da documentação do pgdump você pode INSERT em vez de COPY usando a opção --inserts

Tente usar isso para a Etapa 1:
pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql

Eu também tentei COPY de uma tabela para um arquivo e use COPY para importar e para mim funciona.

Tem certeza de que a codificação do banco de dados do cliente e do servidor é UTF8?

Em primeiro lugar, exporte a tabela chamada "x" do esquema "public" no banco de dados "test" para um arquivo SQL de texto simples:
pg_dump -U postgres -t public."x" test > x.sql

que cria o arquivo x.sql que contém:
--
-- 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
--

Em segundo lugar, importe com:
psql -U postgres -d test -f x.sql