PostgreSQL - 将编码、排序规则和 CType 设置为 'Windows-1252'
PostgreSQL - Set Encoding, Collations and CType to 'Windows-1252'
我正在尝试创建一个数据库,然后创建一个支持特殊法语重音字符的 table。在尝试使用 UTF-8 后,我发现特殊重音字符没有出现在我的数据库中,它们仅作为正常的拉丁字符出现。
所以我做了一些研究,发现正确的编码应该是Windows-1252,一种支持特殊重音字符的编码。
我一直在尝试在我的 PostgreSQL 数据库中实现这种编码,但没有成功。结果保持不变,就好像它们是 UTF-8 编码的一样。我不知道如何为 'WIN1252' 编码编写正确的 Collation 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;
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'
;
我正在尝试创建一个数据库,然后创建一个支持特殊法语重音字符的 table。在尝试使用 UTF-8 后,我发现特殊重音字符没有出现在我的数据库中,它们仅作为正常的拉丁字符出现。
所以我做了一些研究,发现正确的编码应该是Windows-1252,一种支持特殊重音字符的编码。
我一直在尝试在我的 PostgreSQL 数据库中实现这种编码,但没有成功。结果保持不变,就好像它们是 UTF-8 编码的一样。我不知道如何为 'WIN1252' 编码编写正确的 Collation 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;
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'
;