我需要从表中选择数据并使用ORDER BY子句对它们进行排序。 问题是该列包含带有捷克变音符号的文本数据。 我不能使用COLLATE,因为DB是使用lc_collate = en_US.UTF-8创建的postgres集群的一部分,我无法承受因使用正确的lc_collate重新创建集群而导致的停机时间。
示例数据:
CREATE TABLE test (
id serial PRIMARY key,
name text
);
INSERT INTO test (name) VALUES ('Žoo'), ('Zoo'), ('ŽOO'), ('ZOO'),
('ŽoA'), ('ŽóA'), ('ŽoÁ'), ('ŽóÁ');
理想输出:
SELECT * FROM test ORDER BY name COLLATE "cs_CZ.utf8";
id | name
----+------
2 | Zoo
4 | ZOO
5 | ŽoA
7 | ŽoÁ
6 | ŽóA
8 | ŽóÁ
1 | Žoo
3 | ŽOO
(8 rows)
Here我找到了一种解决方案:
SELECT * FROM test ORDER BY name USING ~<~;
id | name
----+------
4 | ZOO
2 | Zoo
3 | ŽOO
5 | ŽoA
1 | Žoo
7 | ŽoÁ
6 | ŽóA
8 | ŽóÁ
(8 rows)
结果足够接近(供我使用) - 卡通信件是非卡车后的。
我对~<~
运算符
修改:转为new question。
回到问题:除了使用正确的区域设置重新创建postgres群集之外,还有其他解决方案可以获得理想的顺序吗?
~<~
运营商的一些关注也很好。
答案 0 :(得分:0)
我不确定我是否理解这个问题,因为看起来你已经找到了解决方案。我可以建议的唯一想法是,您可以使用正确的整理
添加新字段czechName
http://www.postgresql.org/docs/current/static/sql-altertable.html
ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
答案 1 :(得分:0)
与Juan Carlos Oropeza建议的类似,您可以尝试使用以下方法更改列的排序规则:
ALTER TABLE test ALTER COLUMN "name" TYPE text COLLATE 'cs_CZ.utf8';
参考:http://www.postgresql.org/docs/current/static/sql-altertable.html
答案 2 :(得分:0)
正如@Igor在他的评论中指出的那样,没有必要使用不同的 lc_collate 重新创建postgres集群并处理导致的停机时间。
解决问题的确切步骤是:
在cs_CZ.UTF-8 UTF-8
/etc/locale.gen
行
生成新的区域设置:
# locale-gen
在postgres中定义新的排序规则:
CREATE COLLATION "cs_CZ.utf8" ( locale = 'cs_CZ.UTF-8' );