未安装 CHARACTER SET UTF8 的 Firebird 2.5 查询 returns COLLATION UTF8_CI_AI_NUMERIC_SORT

Firebird 2.5 query returns COLLATION UTF8_CI_AI_NUMERIC_SORT for CHARACTER SET UTF8 is not installed

我有一个旧的源数据库,其中显然创建了自定义排序规则 UTF8_CI_AI_NUMERIC_SORT。我正在 运行 通过图片 jacobalberty/firebird:2.5-ss 在 docker 上发布它。最初数据库是在 Windows 机器上创建的。

当我尝试对使用此排序规则的 table 进行查询时,出现错误:

SQL> select * from "InvoiceService";
Statement failed, SQLSTATE = 22021
COLLATION UTF8_CI_AI_NUMERIC_SORT for CHARACTER SET UTF8 is not installed

显示排序规则 returns 以下内容:

SQL> show collations;
UTF8_CI_AI_NUMERIC_SORT, CHARACTER SET UTF8, FROM EXTERNAL ('UNICODE'), CASE INSENSITIVE, ACCENT INSENSITIVE, 'NUMERIC-SORT=1'

我尝试了以下修复:

  1. 将条目添加到 fbintl.conf:
<charset UTF8>
    intl_module fbintl
    collation   UTF8_CI_AI_NUMERIC_SORT
</charset>

然后 运行 sp_register_character_set("UTF8", 4) 过程,并收到关于重复排序规则的错误(因为 UTF8_CI_AI_NUMERIC_SORT 已经在数据库中定义)。

  1. 删除排序规则
SQL> drop collation UTF8_CI_AI_NUMERIC_SORT;
Statement failed, SQLSTATE = 42000
unsuccessful metadata update
-Collation UTF8_CI_AI_NUMERIC_SORT is used in table InvoiceService (field name NAME) and cannot be dropped
  1. 添加将使用不同排序规则的新列,但甚至无法添加:
SQL> ALTER TABLE "InvoiceService" ADD NAME2 VARCHAR(600) CHARACTER SET UTF8;
Statement failed, SQLSTATE = 22021
unsuccessful metadata update
-InvoiceService
-COLLATION UTF8_CI_AI_NUMERIC_SORT for CHARACTER SET UTF8 is not installed
  1. 使用 gbak 仅恢复元数据,修复架构,然后仅插入数据,但 gbak 不支持仅恢复数据

...

我现在没主意了。我还能尝试什么?

所以,我终于设法解决了这个问题。我所做的是使用

创建数据库备份
gbak -v -t -user SYSDBA /path/to/source.fdb /path/to/backup.fbk

然后将 Docker 图像的 3.0 版本与 Firebird DB (jacobalberty/firebird:3.0) 一起使用,并使用

从备份中恢复
gbak -create /path/to/backup.fbk /path/to/restored3.fdb

请注意,不切换 Docker 图像的相同备份恢复过程不起作用。

我不需要做任何其他事情。 SHOW COLLATIONS; 输出只有细微差别:

// originally:
UTF8_CI_AI_NUMERIC_SORT, CHARACTER SET UTF8, FROM EXTERNAL ('UNICODE'), CASE INSENSITIVE, ACCENT INSENSITIVE, 'NUMERIC-SORT=1'

// restored DB
UTF8_CI_AI_NUMERIC_SORT, CHARACTER SET UTF8, FROM EXTERNAL ('UNICODE'), CASE INSENSITIVE, ACCENT INSENSITIVE, 'COLL-VERSION=58.0.6.50;NUMERIC-SORT=1'