Ich habe mein Update jetzt durchgeführt. Für den Fall, dass jemand eine ähnliche Problemstellung hat (oder mir sagt, dass irgendwas von dem gemachten ganz gefährlich oder böse ist), beschreibe ich mal, was ich getan habe:
- einen offiziellen Weg, bei einer bestehenden Datenbank das default charset zu ändern habe ich nicht gefunden. Nachdem meiner Recherche zufolge bei Firebird das Client-Charset und Server-Charset zusammenpassen muss, ist das eh reine Metadata. Geändert werden kann das trotzdem in den Systemtabellen mit
Code:
update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8';
- bei der UIB muss dann auf der Connection noch das (Client-)Chaset angegeben werden:
Delphi-Quellcode:
// set database, user, password, client dll
DbConection.CharacterSet := csUTF8;
DbConection.Connected := true;
- Natürlich gab es noch Tabellen, die noch
ANSI-Daten hatten. Nachdem das nur wenige Tabellen mit wenigen Einträgen waren, lauf ich da einzeln drüber und codiere von Hand um. Hier habe ich noch kein Charset auf der Verbindung geändert. Das Projekt ist auch noch auf Delphi 2006, deswegen auch kein ByNameAsRawByteString.
Delphi-Quellcode:
DBQueryRead.SQL.Text := '
select id, link_name from mytable';
DbQueryWrite.SQL.Text := '
update mytable set link_name=:Name where id=:ID';
// ignore int columns and columns with guaranteed pure ASCII data
DbQueryRead.Open();
while not DbQueryRead.Eof
do
begin
DbQueryWrite.Params.ByNameAsInteger['
ID'] := DbQueryRead.Fields.ByNameAsInteger['
id'];
DbQueryWrite.Params.ByNameAsString['
Name'] := AnsiToUtf8(DbQueryRead.Fields.ByNameAsString['
link_name']);
DbQueryWrite.Execute();
DbQueryRead.Next();
end;
Grüße
Chris