2017-07-19 94 views
1

我有Firebird数据库和字符集WIN1251。数据库已经有几个表。现在我想将默认排序规则更改为WIN1251_UA。所以我不得不执行该语句:更改Firebird数据库和表的默认排序规则

ALTER CHARACTER SET WIN1251 SET DEFAULT COLLATION WIN1251_UA 

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

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

附加信息:使用Firebird 2.5

+0

最可靠的,如果不是非常快速的方式将创建新的字符集中创建新列,复制旧列的内容,删除旧列,并重新命名新列为旧名称,请阅读http://www.sql.ru/forum/297195 –

+0

@Arioch这里有太多的表格。 – Evgeny

+0

枚举它们并自动创建脚本 –

回答

0

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

+0

这不是真的。当然,我可以改变排序规则。看到我的答案。 – Evgeny

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; 
+0

Tnx。但我找到更好的解决方案。看到我的答案。 – Evgeny

+0

到目前为止你在fb25上可以更新系统表,但在更高版本上,不幸的是... –

0

最后我找到了解决方案。例如,如果我想要更改所有表中所有txt字段的排序规则。我可以用这个查询做到这一点:如果一些表格txt场完整性约束的一部分

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

查询将失败。

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

+0

系统表更新是黑客。这不适用于Firebird 3,因为系统表的修改已不再允许,并且如果您在该字段上有索引,检查约束等,或者在比较中使用该字段,它可能会在早期版本中以意想不到的方式中断一个视图或存储过程。 –

相关问题