Jeg har forsøgt at oprette en database med kodning:UTF8 med en tabel og indsæt de to UTF-8-kodede tegn, som COPY-kommandoen forsøger at indsætte, og det virker, når du bruger 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 ('سر');
Ifølge http://rishida.net/tools/conversion/ for den mislykkede COPY er Unicode-kodepunkterne:
som er to tegn , hvilket betyder, at du burde være i stand til at gemme dem i en kolonne defineret som karakter(3), som gemmer strenge op til 3 tegn (ikke bytes) i længden.
og hvis vi forsøger at INDSÆTTE, lykkes det:
INSERT INTO x(
first_two_letters)
VALUES (U&'\0633\0631');
Fra pgdump-dokumentationen du kan INSERT i stedet for COPY ved at bruge --inserts muligheden
Prøv at bruge dette i stedet for trin 1:
pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql
Jeg har også prøvet at KOPIERE fra en tabel til en fil og bruge COPY til at importere, og for mig virker det.
Er du sikker på, at din klient- og serverdatabasekodning er UTF8?
For det første skal du eksportere tabellen med navnet "x" fra skemaet "public" på databasen "test" til en almindelig tekst-SQL-fil:
pg_dump -U postgres -t public."x" test > x.sql
som opretter x.sql-filen, der indeholder:
--
-- 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
--
For det andet skal du importere med:psql -U postgres -d test -f x.sql