sql >> Databáze >  >> RDS >> PostgreSQL

Nelze zkopírovat tabulku do jiné databáze pomocí pg_dump

Pokusil jsem se vytvořit databázi s kódováním:UTF8 s tabulkou a vložit dva znaky kódované UTF-8, které se příkaz COPY pokouší vložit, a funguje to při použití 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 ('سر');

Podle http://rishida.net/tools/conversion/ pro neúspěšnou COPY jsou body kódu Unicode:

což jsou dvě znaky , což znamená, že byste je měli být schopni uložit do sloupce definovaného jako character(3), který ukládá řetězce dlouhé až 3 znaky (nikoli bajty).

a pokud se pokusíme INSERT, podaří se to:

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

Z dokumentace pgdump můžete VLOŽIT místo COPY pomocí volby --inserts

Zkuste toto místo toho použít pro krok 1:

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

Zkoušel jsem také KOPÍROVAT z tabulky do souboru a použít COPY k importu a pro mě to funguje.

Jste si jisti, že kódování vaší klientské a serverové databáze je UTF8?

Nejprve exportujte tabulku s názvem „x“ ze schématu „public“ v databázi „test“ do prostého textového souboru SQL:

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

který vytvoří soubor x.sql, který obsahuje:

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

Za druhé, importujte pomocí:
psql -U postgres -d test -f x.sql



  1. Formátování výsledků dotazu MySQL, jako by byl spuštěn z konzole

  2. Změňte pořadí řádků záznamů databáze prostřednictvím front-endu pomocí php

  3. jak spustit php skript z dávkového souboru

  4. Problém s vytvořením Postgres RDS v Cloudformation Template