Eine Erfahrung: ini_set("default_charset", "UTF-8") und Speichern von Blobs

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo zusammen,

ich schreibe folgende Erfahrung mal als Info, für den Fall, dass vielleicht auch andere
auf die Idee kommen, mit einem ISO8859_1-Web-Server Blobs in einer UTF8-DB speichern
zu wollen / müssen.

Mein Web-Server läuft noch in der Standard-Konfiguration unter ISO8859_1.

Für mein neues DMS (Dokument-Management-System) setze ich jedoch auf UTF8,
weil ich in naher Zukunft auf meine Bestands-Daten dorthin konvertieren werde,
damit die Plagerei mit ISO8859_1 ein Ende hat.

Um das DMS in meinem ISO8859_1-Umfeld trotzdem schon mal testen zu können,
setze ich am Anfang der Scripte ein "ini_set("default_charset", 'UTF-8');".

Das funktioniert mit normalen Daten auch ganz gut, aber mit Blob's nicht.

Wenn ich auf die DB einen Connect mit CharSet = 'UTF8' absetze, dann hängt sich das Scirpt
nach einem fbird_query auf (friert ein), OHNE eine Fehler-Meldung zu geben.

Es geht nichts mehr. Nur das Script abbrechen und neu starten hilft dann nicht. Man muss noch vorher
den FB-Server beenden und die offenen Verbindungen kappen.

Lasse ich am Script-Anfang das "ini_set" weg, dann bleibt das Script beim fbird_query nicht hängen,
speichert aber das Blob nicht.

Nur wenn ich die DB mit "CharSet'] = 'ISO8859_1'" verbinde, dann wird das Blob erfolgreich gespeichert,
egal ob unter "ini_set("default_charset", 'UTF-8');" oder "ini_set("default_charset", 'ISO8859_1');".

Ich schließe daraus, dass der Treiber die "ini_set"-Angabe ignoriert, sondern nur die Server-Konfiguration
akzeptiert und nur mit einer Verbindung über den dort hinterlegten CharSet problemlos funktioniert, also
auch bei Blob's.

Gruss
Hamburgo
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Auch ein BLOB kann mit einer CHARSET-Angabe definiert werden.
BLOB SUBTYPE 1 CHARACTERSET 'UTF8'
Damit sollte es funktionieren.

Wenn man die Blobs aber nicht durchsuchen muss, dafür macht man ja eigentlich Zusatzindizes mit eigenen Feldern, speichere ich die Daten mit Komprimierung und Konvertierung in Base64. Dies spart Platz, geht auf dem Client sehr fix und ist nicht von Charactersets abhängig. Strings im Programm sind heute fast immer sowieso in Unicode (UCS2 oder moderner auch in UTF16),
Somit kann ich dann auch Binary Blobs verwenden.
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hallo Hamburgo,

unabhängig von den Verbindungseinstellungen, darf der Prozess natürlich nicht einfrieren. Ich tippe eher auf einen hängenden Webserver als auf den Firebird, aber das ist zu untersuchen. Ich nehme das zur Prüfung bzw. als Bug für den Treiber auf.

Dank und Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

ich habe auf der Ebene von der Materie nicht genug Ahnung, um das
wirklich final beurteilen zu können, kann mir aber irgendwie nicht vorstellen,
dass der Web-Server sich dabei aufhängt.

Ich setze in der betreffenden Zeile ein ganz normales
"$ResultU = fbird_query($dbh_Blob, $SQL, $BlobID) or die(fbird_errmsg());"
Kommando ab.

Was kann der Web-Server mit dem Kommando am Hut haben ?

Das Kommando wird doch direkt Treiber übergeben oder ?

Viele Grüße
Hamburgo
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Guten Morgen,

über den Web-Server wird die Verbindung aufgebaut, strenger über den PHP-Treiber. Wenn da irgendwas hängt, geht's erstmal nicht weiter. Sobald der FB-Dienst neugestartet wird, trennen sich üblicherweise auch die Verbindungen zwischen Webserver / PHP und Datenbank. Die Ursache ist jedoch üblicherweise nicht die DB. Mit der kann man normalerweise noch weiterarbeiten. Über die Monitoringtabellen sieht man auch die verbundenen Instanzen und kann die Verbindung auch dort beenden.

Also kurzum: Wenn man immernoch auf die Datenbank zugreifen kann, z.B. mit einem anderen Tool, liegt es nicht an Firebird.

Ich werde dem über Ostern auf den Grund gehen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Antworten