Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

MS-SQL und PHP - Umlaute und die Kommandozeile

Einem selt­sa­men Problem im Zusammenhang mit der Lucene-Search, MS-SQL und PHP auf der Kommandozeile bin ich kürz­lich auf die Spur gekom­men. Auf einem Windows-Server mit MS-SQL 2000 waren bei einer Webanwendung in den Suchergebnissen sämt­li­che deut­schen Umlaute ver­schwun­den – Begriffe mit Umlauten wur­den dem­zu­folge von der Suche auch nicht gefunden.

In der CP1252-encodierten MS-SQL-Datenbank stan­den  jedoch alle Umlaute kor­rekt und auch im nor­ma­len UTF‑8 codier­ten Webfrontend gab es kein Umlautproblem; die  dazwi­schen­ge­schal­tete iconv-Zeichensatz Umwandlung von PHP funk­tio­nierte also prin­zi­pi­ell ebenfalls.

Ein Blick in den Suchindex mit Hilfe von Luke bestä­tigte den Verdacht, dass der gesamte Index kei­ner­lei Umlaute ent­hielt. Die Ursache konnte dem­zu­folge nur damit zusam­men­hän­gen, dass der Lucene-Suchindex über die Kommandozeile mit dem PHP- Command Line Interface auf­ge­baut wurde. Offenbar lie­fert MS-SQL andere Daten, abhän­gig vom Kontext in dem es auf­ge­ru­fen wird.

Nach einer län­ge­ren Recherche fand  sich dann auch tat­säch­lich fol­gen­des:

The Microsoft library (DBLIB) detects the con­text it is used in. Calling a php script using the cli ver­sion of PHP uses the default code­page for a DOS box (437 for US). If the same script is cal­led from CGI or ISAPI it will use the Ansi code­page (1252 or wha­te­ver your sys­tem is con­fi­gu­red for).

Tatsächlich lie­ferte die Datenbank bei ISAPI-Aufrufen CP1252 zurück, vom CLI kam jedoch CP850 an, das alte west­eu­ro­päi­sche MS-DOS Standardencoding.

Nun hätte man mit­tels iconv natür­lich auch CP850 in UTF‑8 umwan­deln kön­nen, aller­dings gab es ja bereits eine iconv-Konvertierung von CP1251 nach UTF‑8, diese Möglichkeit schied also aus. Letztgenannte sorgte übri­gens für das voll­stän­dige Verschwinden aller Umlaute aus dem Suchindex, sodass nicht ein­mal mehr die fal­schen Sonderzeichen im Suchindex gelan­det sind.

Die Lösung für den schwer durch­schau­en­den Fehler war dann letzt­lich jedoch ein­fach: Oben genann­tes 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" wer­den die Daten auch auf der Kommandozeile im vor­ge­ge­be­nen Format (hier CP1252) ausgeliefert.

Wird dann der Suchindex neu auf­ge­baut, klappt es auch mit den Umlauten.

Falls man kei­nen Zugriff auf den SQL-Server hat, oder die Einstellung aus einem ande­ren Grund nicht ändern will, kann man das Problem auch umge­hen. Dazu ersetzt man den Kommandozeilenaufruf der php.exe durch den eben­falls im PHP-Standard ent­hal­te­nen php-win.exe Wrapper. Dadurch wird dem SQL-Server ein ISAPI-Aufruf vor­ge­gau­kelt und er lie­fert eben­falls das kor­rekte Encoding zurück.

Related Posts

Pin It on Pinterest