Encoding:UTF8 with tableを使用してデータベースを作成し、COPYコマンドが挿入しようとしている2つのUTF-8エンコード文字を挿入しようとしましたが、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 ('سر');
http://rishida.net/tools/conversion/ によると 失敗したCOPYの場合、Unicodeコードポイントは次のとおりです。
2文字です 、つまり、最大3文字(バイトではない)の長さの文字列を格納するcharacter(3)として定義された列にそれらを格納できる必要があります。
INSERTを実行しようとすると、成功します:
INSERT INTO x(
first_two_letters)
VALUES (U&'\0633\0631');
pgdumpのドキュメント から --insertsオプションを使用すると、COPYの代わりにINSERTを実行できます
ステップ1の代わりにこれを使用してみてください:
pg_dump -U postgres -t OldSchema."TableToCopy" --inserts OldDatabase > Table.sql
また、テーブルからファイルにCOPYを実行し、COPYを使用してインポートしようとしましたが、私にとっては機能します。
クライアントとサーバーのデータベースエンコーディングがUTF8であると確信していますか?
まず、データベース「test」のスキーマ「public」からプレーンテキストのSQLファイルに「x」という名前のテーブルをエクスポートします。
pg_dump -U postgres -t public."x" test > x.sql
これにより、以下を含むx.sqlファイルが作成されます。
--
-- 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
--
次に、次のコマンドでインポートします:
psql -U postgres -d test -f x.sql