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