我在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
答案 0 :(得分:0)
(此答案可能不适用;它是指MySQL归类。)
Unicode定义了一种通用排序规则,对于每种语言,该排序规则在某种程度上倾向于“错误”。你打这样的。
切换到utf8_romanian_ci
,以更改所需的顺序。我认为COLLATION
在MySQL中至少已经使用了十年。
请注意以下两个字母之间的区别:Ș
和Ş
C59E 350=x015E [Ş] L LATIN CAPITAL LETTER S WITH CEDILLA
C898 536=x0218 [Ș] L LATIN CAPITAL LETTER S WITH COMMA BELOW
我指出here,utf8_romanian_ci
(也经过波兰语和土耳其语)正确地对Ş
进行了排序,但是我的列表未能列出S的其他风味。
答案 1 :(得分:0)
根据《 Firebird 2.5语言参考》,您必须将字符集UTF8与排序规则UTF8一起使用,该字符集支持Unicode 4.0支持的所有语言。
如果您的数据库仅在您所在的国家/地区使用,则最好采用具有相同名称归类的字符集ISO8859_2,每个字符宽度仅为1个字节,而对于UTF8,则为4个字节。