Lazarus, UTF8, Firebird und Default Character Set NONE

Ich habe in den letzten Tagen ein wenig mit Lazarus herumgespielt, um damit eventuell (auf Linux) portierbare Frontends für alte, existierende Datenbanken zu bauen. Dabei bin ich über die Problematik gestolpert, dass Lazarus standardmäßig überall mit UTF8 arbeitet, die alten Datenbanken sich aber um Zeichensätze nicht gekümmert haben. Alte Frontends liefen unter Windows irgendwie mit einem Zeichensatz vergleichbar (identisch?) mit ISO Latin 1 (a.k.a ISO 8859-1), der Firebird-Datenbank war es eh egal, was an Zeichen rausgeholt und darin gesichert wurde, kurzum: passte alles. Mit Lazarus/UTF8 und alten Datenbankinhalten in Latin-1 wird alles ein wenig herausfordernder. Aber letztlich ist das alles nichts wirklich Wildes, wenn man weiß, wie es funktioniert.

Man hat drei Möglichkeiten, mit dieser Herausforderung umzugehen:

  1. Für neue Projekte legt man die Datenbank selbst („create database ‚/path/to/db/foobar.fdb‘ default character set UTF8;“) und alle Spalten („foo varchar(42) character set UTF8“) direkt als UTF8 an. Dann muss man im mit Lazarus und den Firebird/Interbase-Datenbankkomponenten gebauten Frontend (so gut wie nichts) beachten.
  2. Ältere Datenbanken konvertiert man komplett mit allen Spalten und allen Inhalten von NONE auf UTF8. Dann hat man wie oben im Frontend auch Ruhe, aber solch eine Konvertierung kann in Arbeit ausarten.
  3. Oder man lässt die alte Datenbank in Ruhe und sorgt im neuen Frontend an den entscheidenden Stellen manuell für eine Zeichensatzumwandlung.

Für den dritten Fall ist Folgendes zu tun (ohne Anspruch auf Vollständigkeit):

  • TIBConnection: Die Datenbankverbindung auf CharSet:= ‚ISO8859_1‘ setzen und mittels UseConnectionCharSetIfNone:= True eine automatische Umwandlung von Datenbankinhalten für die visuellen Datenbankkomponenten aktivieren. In einem DBGrid beispielsweise werden deutsche Umlaute dann richtig dargestellt (stünde das hingegen auf False, dann sähe man nur Fragezeichen statt Umlauten)
  • uses … LConvEncoding
  • Bei jeder TSQLQuery müssen Zeichenketten aus dem Frontend in Richtung Datenbank mittels UTF8ToISO_8859_1() umgewandelt werden. Wer sich SQL-Statements also zusammenbaut und dafür die Inhalte von Eingabefelder verwendet, muss die erst einmal durch die Zeichensatzumwandlung jagen.

Eventuell schreibe ich es demnächst noch ausführlicher auf, aber der geneigte Lazarus-Programmierer sollte vielleicht damit schon auf den richtigen Lösungsweg kommen.

Links: