PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nie można skopiować tabeli do innej bazy danych za pomocą pg_dump

Próbowałem utworzyć bazę danych za pomocą kodowania:UTF8 z tabelą i wstawić dwa zakodowane znaki UTF-8, które polecenie COPY próbuje wstawić i działa przy użyciu 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 ('سر');

Według http://rishida.net/tools/conversion/ dla nieudanej KOPII punkty kodowe Unicode to:

które są dwoma znakami , co oznacza, że ​​powinieneś być w stanie przechowywać je w kolumnie zdefiniowanej jako znak(3), która przechowuje łańcuchy o długości do 3 znaków (nie bajtów).

a jeśli spróbujemy WSTAWIĆ, to się uda:

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

Z dokumentacji pgdump możesz WSTAWIĆ zamiast KOPIUJ, używając opcji --inserts

Spróbuj użyć tego zamiast w kroku 1:

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

Próbowałem również KOPIOWAĆ z tabeli do pliku i użyć COPY do importu i dla mnie to działa.

Czy na pewno kodowanie bazy danych klienta i serwera to UTF8?

Najpierw wyeksportuj tabelę o nazwie „x” ze schematu „public” w bazie danych „test” do zwykłego tekstowego pliku SQL:

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

który tworzy plik x.sql, który zawiera:

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

Po drugie, importuj za pomocą:
psql -U postgres -d test -f x.sql



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Optymalizacja zapytania licznika dla PostgreSQL

  2. Jak filtrować tablicę json na każdy zwrócony wiersz?

  3. LISTEN/NOTIFY za pomocą pg_notify(text, text) w PostgreSQL

  4. Postgresql grupuj według dla wielu linii

  5. Liczenie znaków w sekwencjach za pomocą SQL