Firebird与其他字符集的排序顺序

时间:2016-12-23 14:20:58

标签: firebird firebird2.5

此查询中的排序不考虑帐号,只包含字母:

SELECT CAST(Text AS VARCHAR(20) CHARACTER SET ISO8859_1) COLLATE NO_NO Result FROM (
select CAST('_Anon' AS VARCHAR(20)) COLLATE UNICODE_CI_AI as Text from RDB$DATABASE
UNION
SELECT CAST('Abba' AS VARCHAR(20)) COLLATE UNICODE_CI_AI AS Text from  RDB$DATABASE
UNION
SELECT CAST('Beatles' AS VARCHAR(20)) COLLATE UNICODE_CI_AI AS Text from  RDB$DATABASE)
ORDER BY Result

预期排序顺序(任何字母前的非字母数字):

_Anon
Abba
Beatles

但我明白了:

Abba
_Anon
Beatles

整理并不重要。如果您删除" COLLATE NO_NO"它仍然是错误的。

编辑:发现排序规则ES_ES对此排序正确,但无法对挪威字符进行排序。

这是一个错误还是我在这个查询中遗漏了什么?

我想要做的是在挪威语中获得正确的排序顺序,UNICODE_CI_AI中的所有排序规则都没有给我正确的顺序。

更新:使用另一个子查询扩展示例,以便更清楚地显示该点。

1 个答案:

答案 0 :(得分:2)

Marks暗示要看一下整理指向我的解决方案。

我认为这是一个错误,所以我要向firebirdsql提交错误报告,但发现it's a "Won't fix" and the workaround below is the official fix

在定义的所有基本排序规则中,ES_ *是唯一具有属性的基础:SPECIALS-FIRST = 1 set。事实上,它是唯一具有任何属性集的排序规则。

那个attribute defines特殊字符应该在字母数字字符之前排序。

因此,解决方法是基于NO_NO归类创建新的归类:

CREATE COLLATION NO_NO_NOPAD_CI_SF
FOR ISO8859_1
FROM NO_NO
NO PAD
CASE INSENSITIVE
'SPECIALS-FIRST=1';

然后使用这样的新排序规则:

SELECT CAST(Text AS VARCHAR(20) CHARACTER SET ISO8859_1) COLLATE NO_NO_NOPAD_CI_NUM_SF Result FROM (
select CAST('_Anon' AS VARCHAR(20)) COLLATE UNICODE_CI_AI as Text from RDB$DATABASE
UNION
SELECT CAST('Abba' AS VARCHAR(20)) COLLATE UNICODE_CI_AI AS Text from  RDB$DATABASE
UNION
SELECT CAST('Beatels' AS VARCHAR(20)) COLLATE UNICODE_CI_AI AS Text from  RDB$DATABASE)
ORDER BY Result 

产生预期结果:

_Anon
Abba
Beatles