PostgreSQL实现CH介于C、D间排序?新手一周能否学会自定义collation?
在PostgreSQL中实现CH介于C和D之间的排序规则
一、先试试内置排序规则
不少地区的默认排序规则已经把CH当成独立的排序单元处理,比如西班牙语的排序规则(es_ES.utf8),它天生就会让CH排在C之后、D之前,刚好符合你的需求。
直接在查询里指定这个规则就行:
SELECT country FROM countries ORDER BY country COLLATE "es_ES.utf8";
测试下,你会看到Croatia排在Chile前面,和你期望的一致。
二、没有合适内置规则?自己造一个(PostgreSQL 10+支持)
如果内置规则不符合你的场景,可以用PostgreSQL的ICU支持创建自定义排序规则,步骤很清晰:
1. 先确认你的PostgreSQL带ICU支持
执行这条SQL检查:
SELECT name, setting FROM pg_settings WHERE name = 'icu_enable';
要是返回setting为on,说明能用;如果查不到这个参数,那你的PostgreSQL编译时没开ICU选项,得重新编译或者换个带ICU的版本。
2. 创建自定义排序规则
用CREATE COLLATION命令,直接定义CH的排序位置:
CREATE COLLATION ch_between_c_and_d ( PROVIDER = icu, LOCALE = 'und-u-kb-true-kc-true-col-strength-primary', RULES = '&C < CH < D' );
这里的RULES就是核心,明确指定CH排在C和D之间。
3. 用自定义规则排序
创建好之后,查询或者建表都能用上:
-- 查询时调用自定义规则 SELECT country FROM countries ORDER BY country COLLATE ch_between_c_and_d; -- 建表时直接设为默认排序规则 CREATE TABLE countries ( country text COLLATE ch_between_c_and_d );
三、新手一周能不能学会?完全可以
作为从没操作过的新手,一周时间绝对够:
- 核心就那几步:确认ICU支持、写一条
CREATE COLLATION命令,逻辑没那么复杂 - 你只要会基本的SQL操作,对着示例改一改就行,遇到问题多测试几次调整规则就好
- 官方文档里有明确的示例,跟着走很快就能上手
要是实在搞不定(比如没法装带ICU的PostgreSQL),再考虑临时方案:比如查询时把CH替换成一个介于C和D之间的特殊字符,但这种方法比较绕,不如自定义规则靠谱。
内容的提问来源于stack exchange,提问作者Joe DiNottra
相关产品推荐
相关产品推荐

