此查询中的排序不考虑帐号,只包含字母:
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中的所有排序规则都没有给我正确的顺序。
更新:使用另一个子查询扩展示例,以便更清楚地显示该点。
答案 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