我们有一个数据库,我们的客户端是用Delphi 2007编写的。使用了最新的Interbase 2009。数据库是旧的,我相信它是在2002年左右创建的,现在已超过25 GB。最近我在IBConsole中发现了
upper('åäö')
生成'åäö'。它应该是'ÅÄÖ'。这是英文字母中缺少的瑞典字符。
我搜索了这个主题并找到了这个link。 重要的是:
如何更改默认字符 一组现有数据库?有 没有支持的方法来做到这一点。您 应该从中重新创建数据库 元数据。
这个博客是由Craig Stuntz撰写的2004-06-29,我希望Interbase自那以后有了进化,并且有一种方法可以轻松改变Interbase 2009的角色。如果不可能,可以从gbk备份文件中完成吗?最后一个选项是使用正确的字符集创建一个全新的数据库,并以某种方式从旧的数据库中抽取数据。
所以我有2个问题。
编辑:正如克雷格所说,除了复制知道字符集的数据之外没有其他方法。所以我选择另一种方式。
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获得的结果。也许不是最好的解决方案,但我认为它有效。
答案 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'