PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Tabelle kann mit pg_dump nicht in eine andere Datenbank kopiert werden

Ich habe versucht, eine Datenbank mit Encoding:UTF8 mit einer Tabelle zu erstellen und die beiden UTF-8-codierten Zeichen einzufügen, die der COPY-Befehl einzufügen versucht, und es funktioniert, wenn INSERT verwendet wird.

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 ('سر');

Gemäß http://rishida.net/tools/conversion/ für das fehlgeschlagene COPY sind die Unicode-Codepunkte:

das sind zwei Zeichen , was bedeutet, dass Sie sie in einer als character(3) definierten Spalte speichern können sollten, die Zeichenfolgen mit einer Länge von bis zu 3 Zeichen (nicht Bytes) speichert.

und wenn wir versuchen, INSERT, ist es erfolgreich:

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

Aus der pgdump-Dokumentation Sie können INSERT statt COPY verwenden, indem Sie die Option --inserts

verwenden

Versuchen Sie stattdessen, dies für Schritt 1 zu verwenden:

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

Ich habe auch versucht, aus einer Tabelle in eine Datei zu kopieren und COPY zum Importieren zu verwenden, und bei mir funktioniert es.

Sind Sie sicher, dass die Codierung Ihrer Client- und Serverdatenbank UTF8 ist?

Exportieren Sie zunächst die Tabelle mit dem Namen „x“ aus dem Schema „public“ in der Datenbank „test“ in eine einfache Text-SQL-Datei:

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

wodurch die x.sql-Datei erstellt wird, die Folgendes enthält:

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

Zweitens importieren Sie mit:
psql -U postgres -d test -f x.sql