更改Firebird数据库和表的默认排序规则

时间:2017-07-19 08:21:10

标签: sql firebird firebird2.5

我有Firebird数据库和charset WIN1251。数据库已有几个表。现在我想将默认排序规则更改为WIN1251_UA。所以我执行了这个陈述:

ALTER CHARACTER SET WIN1251 SET DEFAULT COLLATION WIN1251_UA

根据上面this link查询更改数据库的默认排序规则。

现在我遇到了问题:对于所有表格,所有varchar字段仍然有排序WIN1251。如何更改所有现有表的默认排序规则?

其他信息:Firebird 2.5已使用。

3 个答案:

答案 0 :(得分:0)

您无法更改列的排序规则。您需要创建一个新列并复制数据,或者使用正确的DDL创建一个新的空数据库,并使用数据库泵将数据从一个数据库移动到另一个数据库。

另见docs

答案 1 :(得分:0)

如何使用IBExpert及其ibeblock来创建数据库的sql转储。当你创建它时只需更改整理。

这种ibeblock的一个例子:

execute ibeblock
as
begin
cbb = 'execute ibeblock (
       LogLine variant)
     as
     begin
       ibec_progress(LogLine);
     end';

DB = ibec_CreateConnection(__ctInterBase, 
                         'DBName="127.0.0.1:mydatabase";
                          ClientLib=gds32.dll;
                          User=SYSDBA; Password=masterkey; Names=WIN1251; SqlDialect=3');
   try
     ibec_ExtractMetadata(DB, 'c:\test\db.sql',
                         'GenerateCreate;
                          IncludePassword;
                          SetGenerators;
                          ExtractDescriptions;
                          UseComment;
                          ExtractBLOBs;
                          DateFormat=YYYY-MM-DD;
                          DateTimeFormat=YYYY-MM-DD HH:NN:SS;
                          DataTables=MY_TABLE1,MY_TABLE2', 
                          cbb);
  finally
    ibec_CloseConnection(DB);
  end;
end;

答案 2 :(得分:0)

最后我找到了解决方案。例如,如果我想更改所有表中所有txt字段的排序规则。我可以使用此查询执行此操作:

update RDB$RELATION_FIELDS set
RDB$COLLATION_ID = 2
where  rdb$view_context is null and rdb$field_name='TXT';

当然,如果某个表中的txt字段是完整性约束的一部分,则上述查询将失败。

通过这种方式,我可以更改sort子句中使用的其他字段。