Seite 1 von 1

Datenbank mit Zeichensatz UTF-8

Verfasst: Do 3. Okt 2019, 10:44
von Gerd
Hallo.

Sitzung: "Firebird ISQL Tool"

Mit dem Tool soll u. a. ein deutscher Umlaut ü in die mit Zeichensatz UTF-8 belegte Datenbank verein - DB-Tabelle mitglieder geschrieben werden. Geht so nicht:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ISQL Version: WI-T4.0.0.1436 Firebird 4.0 Beta 1
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect 'c:\users\name\documents\firebird\verein.fdb' user 'sysdba' password 'pa$$word';
Server version:
WI-T4.0.0.1436 Firebird 4.0 Beta 1
Database: 'c:\users\name\documents\firebird\verein.fdb', User: SYSDBA
SQL> SHOW TABLES;
MITGLIEDER

SQL> SELECT * FROM mitglieder;

ID NAME
============ ==============================
1 Blume

SQL> UPDATE mitglieder SET name = 'Blümchen' WHERE id = 1;
Statement failed, SQLSTATE = 22000
Malformed string

SQL>

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Ich habe nun die Codepages 850, 1252 und 65001 benutzt, um den Umlaut in die DB-Tabelle zu schreiben. Bei allen kam die gleiche obige Meldung:
"Statement failed, SQLSTATE = 22000
Malformed string"


Ich habe aus den Dokus herausgelesen, dass das mitgelieferte "Firebird ISQL Tool" das jenige Tool sei, mit dem die Firebird-Datenbank administriert werden kann. Man könne mit ihm fast alles machen. Mir soll das recht sein - komme gut damit klar. Es hat einige 'Gemeinsamkeiten' mit dem MariaDB-Tool Command Prompt:
"Setting environment for MariaDB 10.4 (x64)
C:\Windows\system32>"

Ein für mich wichtiger Unterschied besteht wohl offenbar darin, dass ich mit dem erwähnten MariaDB-Tool eine MariaDB UTF-8 Datenbank mit bspw. einem ü selecten oder auch updaten kann - ohne eine Meldung zu erhalten.


Nun habe ich eine weitere Sitzung mit dem "Firebird ISQL Tool" durchgeführt.
Hierbei habe ich die Datenbank verein1.fdb und die DB-Tabelle mitglieder erstellt.
Besonderheit: Ich habe weder den Zeichensatz (somit also: Ohne) noch die PAGE-SIZE vorgegeben.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ISQL Version: WI-T4.0.0.1436 Firebird 4.0 Beta 1
Use CONNECT or CREATE DATABASE to specify a database
SQL> CREATE DATABASE 'c:\users\name\documents\firebird\verein1.fdb'
CON> USER 'sysdba' PASSWORD 'pa$$word'
CON> ;
Server version:
WI-T4.0.0.1436 Firebird 4.0 Beta 1
SQL> CREATE TABLE mitglieder (
CON> id INTEGER NOT NULL,
CON> name VARCHAR(30) NOT NULL
CON> );
SQL> ALTER TABLE mitglieder ADD PRIMARY KEY (id);
SQL> insert into mitglieder (id, name)
CON> values ('1', 'Blümchen');
SQL> SELECT * FROM mitglieder;

ID NAME
============ ==============================
1 Blümchen

SQL>

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Verhaltene Freude. Jetzt nämlich gibt es keine Probleme/Meldungen beim insert, select und update bei Verwendung von ü.

Ich habe gelesen:
Einer Firebird Datenbank der beim createn auch gleich der Zeichensatz (hier: UTF-8) zugewiesen wird, hält diesen Zeichensatz auch immer gleich in den DB-Feldern mit entsprechenden Datentyp als Standard-Vorbelegung bereit. Also: Ein Feld name mit Datentyp varchar(50) wird ohne Angabe eines anderen Zeichensatzes immer auch UTF-8 belegt sein, denn die Datenbank ist bzw. wurde so (UTF-8) angelegt. Oder denke ich falsch?

Und wenn ich nicht falsch denke:
Warum gibt es dann die 'Problemchen' (z.B. mit dem "Firebird ISQL Tool", Windows Eingabeaufforderung) die wohl immer erst dann auftreten, wenn der Datenbank beim createn der Zeichensatz UTF-8 mit zugewiesen wird. Mehr als die Codepage angeben, die bei der Kommunikation mit der Datenbank verwendet werden soll, kann ich doch nicht machen ...

Wie bitte legt Ihr denn Euere Datenbanken in Firebird unter Verwendung von ISQL an - mit Zeichensatzvorgabe oder ohne?

Viele Grüße
Gerd

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Do 3. Okt 2019, 14:11
von bfuerchau
Dazu musst du 2 Dinge betrachten:
Einstellungen der DB betreffen nur die DB und nicht den Client!
Deshalb kannst du in den Connection-Eigenschaften die Codepage deines Clients und nicht der DB einstellen.
In iSQL kommt noch dazu, dass du die Werte ja im SQL-String angeben musst und nicht in Parametervariablen bei Programmcode.
Das ist auch der Grund, warum viele Programmierer nicht vernünftig mit SQL umgehen können und diese immer wieder zusammenstoppeln als Parametermarker und Parametervariablen zu verwenden.

Prüfe mal die Codepage deines Clients (cmd-Box z.B. auf 1252) und setze die Connectioneigenschaft passend.
Dann klappt es auch mit den Umlauten und anderen Sonderzeichen.

Das gilt jedoch nicht innerhalb von Programmen wenn du SQL-Code und Variableninhalt trennst! Da werden z.B. String-Wert (die meist in Unicode sind) vom Treiber korrekt behandelt.

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Do 3. Okt 2019, 16:18
von Gerd
Hallo bfuerchau.

Entschuldigung ... ich bin es noch einmal. Auch auf die Gefahr hin mich zu wiederholen:

Ich create mit ISQL mittels Windows Eingabeaufforderung (die ich auf chcp 65001 eingestellt habe) eine Firebird-Datenbank.
Dabei weise ich ihr den Zeichensatz UTF-8 zu. Ich lege eine DB-Tabelle in dieser Datenbank an.

Wenn ich jetzt mit eben dieser CodePage 65001 (die ist UTF-8-kodiert) ein ü in die gerade erstellte Tabelle schreiben möchte fliege ich raus bzw. beim "Firebird ISQL Tool" erhalte ich eine diesbezügliche Meldung.

Frage: UTF-8 (Eingabeaufforderung) zu UTF-8 (Datenbank -> Datenbankfeld Datentyp: varchar) - warum bitte klappt das nicht?

Wenn ich bspw. bei MaraiaDB so vorgehe, dann funktioniert das. Und das müsste doch auch mit Firebird so funktionieren.
Ich wüßte nicht, was ich anderes tun sollte. Ich kann gar nichts anderes tun.
(Ansonsten muss ich ja darauf verzichten Firebird Datenbanken im UTF-8-Format zu createn, wenn ich dieses Problem nicht in den Griff bekomme. Nur UTF-8 ist quasi fast Standard.)

Und wie ich schon schrieb:
Lege ich eine Datenbank "Ohne" Zeichensatzzuweisung an (denke das ist der Standard in Firebird), dann funktioniert es - mit ich glaube der 1252iger CodePage war es wohl.



Viele Grüße
Gerd

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Fr 4. Okt 2019, 10:39
von bfuerchau
Wie ich auch schon schrieb: Die DB kann durchaus UTF8 und somit Unicode, wenn das Programm ebenso UTF8 und Unicode kann.
Ich denke iSQL selber ist nicht direkt unicodefähig.
Deshalb kann man in der Connection die Codepage des Clients, z.B. WIN1252, angeben. Somit sorgt der Treiber für die Codewandlung in UTF8.

https://www.google.com/url?sa=t&rct=j&q ... cGMlTTbYNG

Später, wenn du per Programm zugreifst, arbeitet man i.d.R. nicht mit gestrickten SQL's sondern mit Parametern.
Bei den Parametern gibt man dann den Feldtyp z.B. WCHAR an. Dies ist in C++/Java/.Net/VB/VBA der Typ String und entspricht dem Unicode UCS2 (16-Bit-Char). Somit kann der Treiber die Umwandlung der Feldwerte in UTF8 vornehmen während der SQL-String selber nur aus ANSI-Zeichen besteht.

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Fr 4. Okt 2019, 16:18
von Gerd
bfuerchau hat geschrieben: Fr 4. Okt 2019, 10:39 Wie ich auch schon schrieb: Die DB kann durchaus UTF8
Davon gehe ich aus.
bfuerchau hat geschrieben: Fr 4. Okt 2019, 10:39 ... wenn das Programm ebenso UTF8 und Unicode kann.
Was bitte meinst Du mit 'Programm'? (Das ISQL-Tool?)
bfuerchau hat geschrieben: Fr 4. Okt 2019, 10:39 Ich denke iSQL selber ist nicht direkt unicodefähig.
Aber die Session liefe doch dann ggfls. auf einer Codepage 65001 (UTF8).
bfuerchau hat geschrieben: Fr 4. Okt 2019, 10:39 Deshalb kann man in der Connection die Codepage des Clients, z.B. WIN1252, angeben. Somit sorgt der Treiber für die Codewandlung in UTF8.
Und genau DAS scheint ja das Problem zu sein.
Eine UTF8-Firebird-Datenbank kann ich offenbar nicht mit chp 1252 oder logischer chp 65001 mit dem ISQL-Tool bearbeiten. Beim SELECT, INSERT und UPDATE bspw. eines ü kommen Darstellungsprobleme im laufenden ISQL-Tool. :|

Viele Grüße
Gerd

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Fr 4. Okt 2019, 19:03
von bfuerchau
Nochmal gaaanz langsam :( :

Die CMD-Box hat zwar eine Codepage, d.h. aber nicht das das aufgerufene Programm also iSQL auch mit dieser arbeitet!

Ich habe bereits mehrfach darauf hingewiesen, dass du in der Connection die Codepage mit der der Client arbeitet eintragen musst.

Den Rest erldigt dann der Treiber.

Du hast mir noch nicht bestätigt, dass du in der Connection "CHARSET=WIN1252;" mal ausprobiert hast.
Denn dafür ist die Angabe da, dass der Client eine andere Codepage als die Datenbank haben kann.

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Fr 4. Okt 2019, 19:40
von Gerd
bfuerchau hat geschrieben: Fr 4. Okt 2019, 19:03 Die CMD-Box hat zwar eine Codepage, d.h. aber nicht das das aufgerufene Programm also iSQL auch mit dieser arbeitet!
Hm... dann würde ich aber erwarten, dass ISQL, wenn es unter der Codepage 65001 aufgerufen wird, dies dann auch mitteilt.
Sollte es wirklich nicht mit dieser Codepage arbeiten - dann ist das eine schlechte Nachricht.
Danke für die Info.
bfuerchau hat geschrieben: Fr 4. Okt 2019, 19:03 Du hast mir noch nicht bestätigt, dass du in der Connection "CHARSET=WIN1252;" mal ausprobiert hast.
Ich weiß leider nicht, was du mit 'in der Connection' meinst. Wo wäre denn diese Stelle? :?

Viele Grüße
Gerd

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Sa 5. Okt 2019, 16:10
von Gerd
Hallo.

Hier die Zusammenfassung für dieses Thema und auch für dieses Thema: viewtopic.php?f=4&t=70

Beide Themen betrachte ich für mich als 'Gelöst'. :)

Firebird 4.0 Beta 1
Das "Firebird ISQL Tool" (isql.exe) wird, abhängig von den Parametern, entweder als interaktive oder nicht interaktive Session ausgeführt. Welche Parameter zu den genannten Sessionsunterschieden führen, lässt sich hier nachlesen:
https://firebirdsql.org/manual/isql-start-session.html

Hier ging und geht es ausschließlich um die interaktive Session mit dem Firebird ISQL Tool (--> manche schreiben auch: Firebird iSQL Tool).

Unter Windows läuft das "Firebird ISQL Tool" als Konsolenprogramm in einem Konsolen-Fenster.

Nach meinen bescheidenen Kenntnissen aktivieren deutsche Versionen von DOS und Windows standardmäßig Codepage 850.
Ich leite daraus ab, dass das "Firebird ISQL Tool" mit genau dieser Codepage (mit diesem Zeichensatz) im Konsolen-Fenster läuft.

Registry-Check meines PCs:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage Wert "OEMCP" -> 850 OK


Wenn man mit dem "Firebird ISQL Tool" eine Datenbank erzeugt und ihr als optionalen Parameter DEFAULT CHARACTER SET UTF8 mit auf dem Weg gibt, dann reicht das alleine nicht aus:

1. Das "Firebird ISQL Tool", aufgerufen über Start - Programme ..., würde sowieso scheitern, denn es läuft (wie oben angesprochen) im Konsolen-Fenster sehr wahrscheinlich mit Codepage 850. Das zu verändern habe ich keine Möglichkeit gefunden.
2. Wird nun die Windows Eingabeaufforderung herangezogen kann diese auf chcp 65001 gesetzt werden. Notwendiger Schritt - reicht aber auch nicht für eine korrekte Darstellung z. B. deutscher Umlaute.

Was fehlt also noch?
Und da hat mich der Connection-Hinweis von @bfuerchau nicht zur Ruhe kommen lassen.
Hier der entsprechende Auszug aus der Dokumentation:
"Optional SET NAMES: Klausel, die den Zeichensatz der Verbindung angibt, die verfügbar ist, nachdem die Datenbank erfolgreich erstellt wurde. Der Zeichensatz NONE wird standardmäßig verwendet. Beachten Sie, dass der Zeichensatz in einem Apostroph-Paar eingeschlossen sein sollte (einfache Anführungszeichen)."
Quelle: https://firebirdsql.org/file/documentat ... db-de.html

Im Hinblick auf eine korrekte UTF-8-Zeichendarstellung unter Verwendung des "Firebird ISQL Tool", welches über die Windows Eingabeaufforderung aufgrufen wird, sehen zwei beispielhafte Sessionen so aus:

Datenbank erzeugen
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\name>chcp 65001
Aktive Codepage: 65001.

C:\Users\name>isql -z
ISQL Version: WI-T4.0.0.1436 Firebird 4.0 Beta 1
Use CONNECT or CREATE DATABASE to specify a database
SQL> CREATE DATABASE 'c:\users\name\documents\firebird\meine_datenbank.fdb'
USER 'sysdba' PASSWORD 'pa$$word'
PAGE_SIZE 8192
SET NAMES 'UTF8'
DEFAULT CHARACTER SET UTF8;
Server version:
WI-T4.0.0.1436 Firebird 4.0 Beta 1
SQL>

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Datenbank connecten und selecten
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\name>chcp 65001
Aktive Codepage: 65001.

C:\Users\name>isql -z
ISQL Version: WI-T4.0.0.1436 Firebird 4.0 Beta 1
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect 'c:\users\name\documents\firebird\meine_datenbank.fdb' user 'sysdba' password 'pa$$word';
Server version:
WI-T4.0.0.1436 Firebird 4.0 Beta 1
Database: 'c:\users\name\documents\firebird\meine_datenbank.fdb', User: SYSDBA
SQL> SELECT Feld1, Feld2, Feld3, Feld4
CON> FROM meine_tabelle;
=================================
Korrekte Darstellung der Umlaute (z. B. ü)
SQL>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Es hätte mich doch sehr gewundert, wenn man mit dem "Firebird ISQL Tool" eine UTF8-Datenbank erzeugen kann - dann aber Abstriche bei derDarstellung der Zeichen im Konsolen-Fenster hinnehmen soll. Gutes Tool. :)

Herzlichen Dank an:
@bfuerchau (Der wahrscheinlich damit begonnen hat sich die Haare deswegen zu raufen - aber zuguterletzt den entscheidenden Hinweis gab.)
@Martin (Der zielführend die Umlaut-Problematik ins Spiel brachte.)
@Macher der Firebird-Dokumentation


Viele Grüße
Gerd

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: Sa 5. Okt 2019, 17:53
von bfuerchau
Bei 2mm Haarschnitt ist nix da zum raufen;-).
Mach aber ruhig weiter so... :ugeek:

Re: Datenbank mit Zeichensatz UTF-8

Verfasst: So 6. Okt 2019, 12:51
von martin.koeditz
Hallo Gerd,

schön, dass deine Probleme gelöst sind. Und danke für das Feedback.

Gruß
Martin