Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

MS-SQL und PHP – Umlaute und die Kommandozeile

Einem seltsamen Problem im Zusammenhang mit der Lucene-Search, MS-SQL und PHP auf der Kommandozeile bin ich kürzlich auf die Spur gekommen. Auf einem Windows-Server mit MS-SQL 2000 waren bei einer Webanwendung in den Suchergebnissen sämtliche deutschen Umlaute verschwunden – Begriffe mit Umlauten wurden demzufolge von der Suche auch nicht gefunden.

In der CP1252-encodierten MS-SQL-Datenbank standen  jedoch alle Umlaute korrekt und auch im normalen UTF-8 codierten Webfrontend gab es kein Umlautproblem; die  dazwischengeschaltete iconv-Zeichensatz Umwandlung von PHP funktionierte also prinzipiell ebenfalls.

Ein Blick in den Suchindex mit Hilfe von Luke bestätigte den Verdacht, dass der gesamte Index keinerlei Umlaute enthielt. Die Ursache konnte demzufolge nur damit zusammenhängen, dass der Lucene-Suchindex über die Kommandozeile mit dem PHP- Command Line Interface aufgebaut wurde. Offenbar liefert MS-SQL andere Daten, abhängig vom Kontext in dem es aufgerufen wird.

Nach einer längeren Recherche fand  sich dann auch tatsächlich folgendes:

The Microsoft library (DBLIB) detects the context it is used in. Calling a php script using the cli version of PHP uses the default codepage for a DOS box (437 for US). If the same script is called from CGI or ISAPI it will use the Ansi codepage (1252 or whatever your system is configured for).

Tatsächlich lieferte die Datenbank bei ISAPI-Aufrufen CP1252 zurück, vom CLI kam jedoch CP850 an, das alte westeuropäische MS-DOS Standardencoding.

Nun hätte man mittels iconv natürlich auch CP850 in UTF-8 umwandeln können, allerdings gab es ja bereits eine iconv-Konvertierung von CP1251 nach UTF-8, diese Möglichkeit schied also aus. Letztgenannte sorgte übrigens für das vollständige Verschwinden aller Umlaute aus dem Suchindex, sodass nicht einmal mehr die falschen Sonderzeichen im Suchindex gelandet sind.

Die Lösung für den schwer durchschauenden Fehler war dann letztlich jedoch einfach: Oben genanntes Verhalten des MS-SQL Servers lässt sich über eine Checkbox im SQL-Server-Clientkonfigurationsprogramm unter „DB-Bibiliotheksoptionen“ steuern.

Entfernt man das Häkchen bei „Automatische Konvertierung von ANSI in OEM“ werden die Daten auch auf der Kommandozeile im vorgegebenen Format (hier CP1252) ausgeliefert.

Wird dann der Suchindex neu aufgebaut, klappt es auch mit den Umlauten.

Falls man keinen Zugriff auf den SQL-Server hat, oder die Einstellung aus einem anderen Grund nicht ändern will, kann man das Problem auch umgehen. Dazu ersetzt man den Kommandozeilenaufruf der php.exe durch den ebenfalls im PHP-Standard enthaltenen php-win.exe Wrapper. Dadurch wird dem SQL-Server ein ISAPI-Aufruf vorgegaukelt und er liefert ebenfalls das korrekte Encoding zurück.

Kommentar hinterlassen


Pin It on Pinterest