【问题标题】:Firebird 2.5.6 romanian collation for UTF8 charsetUTF8 字符集的 Firebird 2.5.6 罗马尼亚语排序规则
【发布时间】: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


【解决方案1】:

(此答案可能不适用;它指的是 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 的另一种风格。

【讨论】:

    【解决方案2】:

    根据 Firebird 2.5 语言参考,您必须使用字符集 UTF8 和排序规则 UTF8,它支持 Unicode 4.0 支持的所有语言。

    如果您的数据库仅在您所在的国家/地区使用,您最好采用具有同名排序规则的字符集 ISO8859_2,每个字符只有 1 个字节宽,而不是 UTF8 的 4 个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2015-05-15
      • 2016-09-23
      • 1970-01-01
      相关资源
      最近更新 更多