如何更改InterBase现有数据库的字符集
-
30-09-2019 - |
题
我们有一个数据库,我们的客户端是使用Delphi 2007编写的。使用了最新的InterBase 2009。数据库是旧的,我相信它是在2002年左右创建的,现在已超过25 GB。最近我在ibconsole中发现
upper('åäö')
产生“Åäö”。应该是“Åäö”。这是英语字母中缺少的瑞典角色。
我搜索了这个主题,发现了这个 关联。重要的部分是:
如何更改现有数据库的默认字符集?没有支持的方法来做到这一点。您应该从元数据重新创建数据库。
该博客是由Craig Stuntz撰写的2004-06-29,我希望Interbase从那以后发展了,并且有一种方法可以改变Interbase 2009的角色集,而很少努力。如果不可能,可以从GBK备份文件中完成?最后一个选项是创建一个具有正确的字符集的全新数据库,并以某种方式从旧数据库中创建泵数据。
所以我有2个问题。
- 更改字符的最简单方法是什么?
- 我应该选择哪个字符具有鞋帮('Åäö')='Åäö'
编辑: 正如克雷格(Craig)所说,除了复制了解charset的数据之外,没有真正的方法。所以我选择了另一种方式。
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获得的结果。也许不是最好的解决方案,但我认为它有效。
解决方案
用于瑞典使用ISO-8859-1或Unicode。我不熟悉IB 2009中现有DBS中现有DB中的默认字符的任何新方法。当您考虑所涉及的内容时,您会发现您会重新创建DB。您将更改DB中所有文本的存储格式!
泵送数据的最简单方法可能是一个专用数据泵 DB工作台. 。您需要此版本的“ Pro”版本,但是有一个免费试用版可以查看它是否有效。同样,请考虑您可能无法直接复制数据;您必须以一种炭化的方式来做。这就是为什么您应该始终从欧洲人那里购买数据库管理工具的原因。 :)
其他提示
有一个名为FBClone的免费命令行工具实用程序:它能够重新创建您的数据库更改字符集。该项目使用UIB组件,因此可以使用Interbase或Firebird。http://code.google.com/p/fbclone/
update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8'