Question

We have a database and our client is written with Delphi 2007. The latest Interbase 2009 is used. The database is old, I believe it was created around 2002 and is now over 25 GB. Recently I discovered that in IBConsole

upper('åäö')

generate 'åäö'. It should be 'ÅÄÖ'. This is swedish characters that are missing in the English alphabet.

I searched about the subject and found this link. The important part is:

How Can I Change the Default Character Set of an Existing Database? There is no supported way to do this. You should recreate the database from metadata.

This blog was written 2004-06-29 by Craig Stuntz, My hope is that Interbase has evolved since that and there is a way to change the characterset for Interbase 2009 with little effort. If not possible can it be done from a gbk backup file ? The last option is to create a completely new database with the right characterset and somehow pump data from the old one.

So I have 2 questions.

  1. What is the easiest way to change characterset ?
  2. What characterset should I choose to have upper('åäö') = 'ÅÄÖ'

EDIT: As Craig said there is no real way except copy the data that are aware the charset. So I choose another way.

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;

This simply convert back Swedish characters in this case back to lowercase as this is the result I get from Interbase. Maybe not the nicest solution but I think it works.

Was it helpful?

Solution

For Swedish use ISO-8859-1 or UNICODE. I am not familiar with any new way to change the default charset in existing DBs in IB 2009. When you think about what's involved you'll see you'd be recreating the DB anyway; you'd be changing the storage format of all text in the DB!

Easiest way to pump the data is probably a dedicated data pump like the one in DB Workbench. You need the "Pro" edition for this, but there's a free trial to see if it works. Again, consider that you may not be able to just directly copy data; you'll have to do it in a charset-aware way. This is why you should always buy your DB management tool from a European person. :)

OTHER TIPS

There is a free command line tool utility named FBClone: It is able to recreate your database changing the character set. The project use UIB components, so it is able to use Interbase or Firebird. http://code.google.com/p/fbclone/

update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top