【问题标题】:PostgreSQL - Set Encoding, Collations and CType to 'Windows-1252'PostgreSQL - 将编码、排序规则和 CType 设置为“Windows-1252”
【发布时间】:2018-03-23 09:37:42
【问题描述】:

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

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

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

输出:

【问题讨论】:

    标签: postgresql special-characters diacritics windows-1252


    【解决方案1】:

    需要将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。排序规则类型必须存在创建数据库时。

    您可以通过(连接到 template1 和)在 psql 终端中使用 \dOS+ 列出可用的排序规则。 [我在我的安装中找不到fr_fr.utf8]


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

    【讨论】:

    • 请看我的补充。关键是:终端对采用哪种编码有自己的想法。这应该匹配数据库端的 client_encoding 设置。
    • 因此,我的 hexdump 包含 double 编码字符:,Compte 以 c3 83 c2 a9 结尾。 (这是由于对 DBMS 撒谎造成的:我的客户在为插入提供 VALUES 时实际上使用了 unicode 编码)
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 2018-06-10
    • 2022-01-16
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多