火鸟2.5.6罗马尼亚整理为UTF8 charset

时间:2016-12-13 11:50:34

标签: sql utf-8 firebird collation

我在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

的字符集的情况下完成此操作

2 个答案:

答案 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

我指出hereutf8_romanian_ci(也经过波兰语和土耳其语)正确地对Ş进行了排序,但是我的列表未能列出S的其他风味。

答案 1 :(得分:0)

根据《 Firebird 2.5语言参考》,您必须将字符集UTF8与排序规则UTF8一起使用,该字符集支持Unicode 4.0支持的所有语言。

如果您的数据库仅在您所在的国家/地区使用,则最好采用具有相同名称归类的字符集ISO8859_2,每个字符宽度仅为1个字节,而对于UTF8,则为4个字节。