【发布时间】:2016-12-13 11:50:34
【问题描述】:
我在 Firebird 2.5.6 中有一张桌子。它具有 UTF8 字符集并包含罗马尼亚字符。但是,当我想按罗马尼亚逻辑对字符进行排序时,结果是错误的。
可以在下面找到此问题的示例:
CREATE TABLE TEST (
ID INTEGER DEFAULT 0 NOT NULL,
TXT VARCHAR(20) CHARACTER SET UTF8 DEFAULT '-' NOT NULL COLLATE UTF8,
PRIMARY KEY (ID)
);
假设我插入以下行:
INSERT INTO TEST (ID, TXT) VALUES (1, 'S');
INSERT INTO TEST (ID, TXT) VALUES (2, 'SA');
INSERT INTO TEST (ID, TXT) VALUES (3, 'Ș');
INSERT INTO TEST (ID, TXT) VALUES (4, 'ȘA');
INSERT INTO TEST (ID, TXT) VALUES (5, 'T');
INSERT INTO TEST (ID, TXT) VALUES (6, 'TA');
INSERT INTO TEST (ID, TXT) VALUES (7, 'Ț');
INSERT INTO TEST (ID, TXT) VALUES (8, 'ȚA');
当我运行以下查询时,结果不是我所期望的。
select id, txt from test order by txt
返回:
ID TXT
1 S
2 SA
5 T
6 TA
3 Ș
4 ȘA
7 Ț
8 ȚA
但罗马尼亚语的正确顺序是:
ID TXT
1 S
2 SA
3 Ș
4 ȘA
5 T
6 TA
7 Ț
8 ȚA
可以在不更改 UTF8 的字符集的情况下完成此操作吗?
【问题讨论】:
-
也许
order by txt collate UNICODE有效。据我所知,没有可用的特殊罗马尼亚语排序规则。 -
标准的 unicode 排序规则是通用的 unicode 排序,而不是罗马尼亚语。您将需要创建罗马尼亚特定的排序规则,这可能需要您将 ICU 库替换为另一个版本(因为 Windows 上的 Firebird 附带的版本不包含完整的 ICU 集)。不幸的是,Firebird 的 collation 文档缺乏详细信息。
-
例如,命令应该类似于
create collation utf8_ro for utf8 from UNICODE 'locale=ro',但由于 Firebird 附带的有限 ICU 库,它可能会失败,另请参阅 stackoverflow.com/questions/40449451/…
标签: sql utf-8 firebird collation