如何为Interbase更改现有数据库的字符集

时间:2010-08-22 19:29:29

标签: sql delphi character-encoding delphi-2007 interbase

我们有一个数据库,我们的客户端是用Delphi 2007编写的。使用了最新的Interbase 2009。数据库是旧的,我相信它是在2002年左右创建的,现在已超过25 GB。最近我在IBConsole中发现了

upper('åäö')

生成'åäö'。它应该是'ÅÄÖ'。这是英文字母中缺少的瑞典字符。

我搜索了这个主题并找到了这个link。 重要的是:

  

如何更改默认字符   一组现有数据库?有   没有支持的方法来做到这一点。您   应该从中重新创建数据库   元数据。

这个博客是由Craig Stuntz撰写的2004-06-29,我希望Interbase自那以后有了进化,并且有一种方法可以轻松改变Interbase 2009的角色。如果不可能,可以从gbk备份文件中完成吗?最后一个选项是使用正确的字符集创建一个全新的数据库,并以某种方式从旧的数据库中抽取数据。

所以我有2个问题。

  1. 更改字符集的最简单方法是什么?
  2. 我应该选择哪种角色('åäö')='ÅÄÖ'
  3. 编辑:正如克雷格所说,除了复制知道字符集的数据之外没有其他方法。所以我选择另一种方式。

    vName := AnsiUpperCase(Nametosearch);
    MakeCharLowercase(vName, 'åäö');
    // Then use vName when search in database.
    
    procedure TDuplicateDeptForm.MakeCharLowercase(var aName: String; aCharSet: String);
    var
      vIndex, i: Integer;
      vChar: String;
    begin
      for i := 1 to Length(aCharSet) do
      begin
        vChar := AnsiUpperCase(aCharSet[i]);
        repeat
          vIndex := AnsiPos(vChar, aName);
          if vIndex > 0 then
            aName[vIndex] := AnsiLowerCase(vChar)[1];
        until vIndex = 0;
      end;
    end;
    

    这简单地将瑞典语字符转换回小写,因为这是我从Interbase获得的结果。也许不是最好的解决方案,但我认为它有效。

3 个答案:

答案 0 :(得分:4)

有一个名为FBClone的免费命令行工具实用程序: 它能够重新创建更改字符集的数据库。 该项目使用UIB组件,因此它可以使用Interbase或Firebird。 http://code.google.com/p/fbclone/

答案 1 :(得分:3)

瑞典语使用ISO-8859-1或UNICODE。我不熟悉在IB 2009中更改现有DB中的默认字符集的任何新方法。当您考虑所涉及的内容时,您将看到您无论如何都要重新创建数据库;你要改变数据库中所有文本的存储格式!

抽取数据的最简单方法可能是像DB Workbench中那样的专用数据泵。你需要“Pro”版本,但有一个免费试用版,看看它是否有效。再次,考虑您可能无法直接复制数据;你必须以charset-aware的方式去做。这就是您应该始终从欧洲人那里购买数据库管理工具的原因。 :)

答案 2 :(得分:1)

update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8'