PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Impossible de copier la table dans une autre base de données avec pg_dump

J'ai essayé de créer une base de données avec Encoding :UTF8 avec une table et d'insérer les deux caractères encodés UTF-8 que la commande COPY essaie d'insérer et cela fonctionne lors de l'utilisation de 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 ('سر');

Selon http://rishida.net/tools/conversion/ pour le COPY défaillant, les points de code Unicode sont :

qui sont deux caractères , ce qui signifie que vous devriez pouvoir les stocker dans une colonne définie comme caractère (3), qui stocke des chaînes jusqu'à 3 caractères (et non des octets).

et si nous essayons d'INSÉRER, cela réussit :

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

À partir de la documentation pgdump vous pouvez INSÉRER au lieu de COPIER en utilisant l'option --inserts

Essayez d'utiliser ceci à la place pour l'étape 1 :

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

J'ai également essayé de COPIER d'une table vers un fichier et d'utiliser COPIER pour importer et pour moi cela fonctionne.

Êtes-vous sûr que l'encodage de votre base de données client et serveur est UTF8 ?

Tout d'abord, exportez la table nommée "x" du schéma "public" sur la base de données "test" vers un fichier SQL en texte brut :

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

qui crée le fichier x.sql qui contient :

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

Deuxièmement, importez avec :
psql -U postgres -d test -f x.sql