PostgreSQL-将编码、排序规则和CType设置为“Windows-1252”

PostgreSQL-将编码、排序规则和CType设置为“Windows-1252”,postgresql,special-characters,diacritics,windows-1252,Postgresql,Special Characters,Diacritics,Windows 1252,我正在尝试创建一个数据库,然后创建一个支持特殊法语重音字符的表。在尝试UTF-8之后,我发现特殊的重音字符不会出现在我的数据库中,它们只显示为普通的拉丁字符 所以我做了一些研究,发现正确的编码应该是,一种支持特殊重音字符的编码 我一直试图在我的PostgreSQL数据库中实现这种编码,但没有成功。结果保持不变,就好像它们是UTF-8编码的一样。我不知道如何为“WIN1252”编码编写正确的排序规则anc Ctype值 这就是我一直在做的: UPDATE pg_database SET datal

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

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

我一直试图在我的PostgreSQL数据库中实现这种编码,但没有成功。结果保持不变,就好像它们是UTF-8编码的一样。我不知道如何为“WIN1252”编码编写正确的排序规则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');
输出:

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

您还可以在连接时将整个数据库的客户机_编码设置为cp1252,客户机始终可以否决此设置

您可以通过转储到ascii文件并将其转储来检查编码

如果要创建具有特定排序规则的数据库,则需要在创建时指定该排序规则,并使用template0或通过专门准备的模板\u XXX。创建数据库时,排序规则类型必须存在

通过连接到template1并在psql终端中使用\dOS+,可以列出可用的排序规则。 [在我的安装中找不到fr\u fr.utf8]

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

您还可以在连接时将整个数据库的客户机_编码设置为cp1252,客户机始终可以否决此设置

您可以通过转储到ascii文件并将其转储来检查编码

如果要创建具有特定排序规则的数据库,则需要在创建时指定该排序规则,并使用template0或通过专门准备的模板\u XXX。创建数据库时,排序规则类型必须存在

通过连接到template1并在psql终端中使用\dOS+,可以列出可用的排序规则。 [在我的安装中找不到fr\u fr.utf8]


请看我的补充。关键是:终端对采用哪种编码有自己的想法。这应该与数据库端的客户端编码设置相匹配。因此,我的hextump包含双编码字符:,Compte以c3 83 c2 a9结尾。这是由于对DBMS撒谎造成的:我的客户机在为insert提供值时实际上使用了unicode编码。请参阅我的添加内容。关键是:终端对采用哪种编码有自己的想法。这应该与数据库端的客户端编码设置相匹配。因此,我的hextump包含双编码字符:,Compte以c3 83 c2 a9结尾。这是由于对DBMS撒谎造成的:我的客户机在为insert提供值时实际上使用了unicode编码
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;
ALTER DATABASE compte
        SET client_encoding = WIN1252;

-- copy locations TO '/tmp/locations.tsv' ;
DROP DATABASE compte ;
CREATE DATABASE compte WITH
        TEMPLATE = template0
        encoding = 'utf8'
        LC_COLLATE = 'en_CA.utf8'
        LC_CTYPE = 'en_CA.utf8'
        ;