PostgreSQL - 将编码,排序和CType设置为'Windows-1252'

时间:2018-03-23 09:37:43

标签: postgresql special-characters diacritics windows-1252

我正在尝试创建一个数据库,然后创建一个支持特殊法语重音字符的表。尝试UTF-8后,我发现我的数据库中没有出现特殊的重音字符,它们只显示为普通的拉丁字符。

所以我做了一些研究,发现正确的编码应该是Windows-1252,这是一种支持特殊重音字符的编码。

我一直在尝试在PostgreSQL数据库中实现这种编码,但没有成功。结果保持不变,就好像它们是UTF-8编码的一样。我不知道如何为'WIN1252'编码编写正确的Collat​​ion anc Ctype值。

这就是我一直在做的事情:

UPDATE pg_database SET datallowconn = TRUE WHERE datname = 'template0';

\c template0

UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

DROP DATABASE template1;

CREATE DATABASE template1 WITH owner=postgres ENCODING = 'WIN2512' TEMPLATE template0;

UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

\c template1

UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'template0';

CREATE DATABASE test_database2 WITH OWNER postgres ENCODING 'WIN1252' TEMPLATE template1;

\c test_database2;

CREATE TABLE locations (locations VARCHAR(255));

INSERT INTO locations VALUES ('Franche-Comté');
INSERT INTO locations VALUES ('Midi-Pyrénées');
INSERT INTO locations VALUES ('Provence-Alpes-Côte d Azur');

输出:

enter image description here

1 个答案:

答案 0 :(得分:3)

您需要将client_encoding设置为WIN1252并将数据库编码保持为utf8;

DROP DATABASE compte ;
CREATE DATABASE compte WITH encoding = 'utf8' ;

\c compte;

SET client_encoding = WIN1252;

CREATE TABLE locations (locations VARCHAR(255));

INSERT INTO locations VALUES ('Franche-Comté')
                        , ('Midi-Pyrénées')
                        , ('Provence-Alpes-Côte d Azur');

SELECT * FROM locations;

您还可以将整个数据库的client_encoding设置为cp1252(连接时,客户端总是可以取代它)

(您可以通过转储到 ascii 文件来检查编码并进行重复数据删除)

ALTER DATABASE compte
        SET client_encoding = WIN1252;

-- copy locations TO '/tmp/locations.tsv' ;

如果要使用特定排序规则创建数据库,则需要在创建数据库时指定,并使用template0(或通过专门准备的template_XXX。排序规则类型必须存在创建数据库时。

您可以使用psql终端中的\dOS+列出(连接到template1和)的可用归类。 [我在我的安装中找不到fr_fr.utf8

DROP DATABASE compte ;
CREATE DATABASE compte WITH
        TEMPLATE = template0
        encoding = 'utf8'
        LC_COLLATE = 'en_CA.utf8'
        LC_CTYPE = 'en_CA.utf8'
        ;