Perl TDS-Zeichensätze

7

Ich verwende den FreeTDS-Treiber mit DBD :: Sybase und verbinde mich mit einem MS SQL Server. Wenn ich bestimmte Werte bestimmter Datensätze abfrage, wird folgende Fehlermeldung angezeigt:

DBD::Sybase::st fetchrow_arrayref failed: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (9) NUMBER = (99)
Server , database 
Message String: WARNING! Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks ('?').

Dies scheint bei Datensätzen zu passieren, die spezielle Windows-Zeichensatzzeichen enthalten, z. B. geschweifte Anführungszeichen, die aus den Outlook- und Word-Nachrichten von Personen kopiert und eingefügt wurden.

Leider habe ich keine Kontrolle über diese Datenbank; Die Eingabe auf dem Weg nach innen zu bereinigen ist natürlich der richtige Weg, steht mir aber nicht zur Verfügung.

Welche FreeTDS-Einstellungen muss ich ändern, um diese Datensätze erfolgreich abfragen zu können?

Zusätzliche Information:

Die Abfrage funktioniert gut von tsql. Ich erhalte diesen Fehler nur über die DBD :: Sybase-Schnittstelle von Perl. (Soll ich etwas anderes testen? Ich habe noch nicht das Fachwissen, um PHP oder Python zu installieren. Ich habe jTDS und kann es verwenden, aber ich denke, das ist eine völlig andere Implementierung, keine Schnittstelle zu FreeTDS.)

Hinzufügen

client charset = UTF-8

zu meiner freetds.conf Datei führt zu "Nicht genügend Speicher!" gedruckt auf STDERR.

Skiphoppy
quelle
Jemand verschiebt dies bitte zurück zu StackOverflow.com, da es sich um eine Frage zur Perl-Programmierung handelt.
Skiphoppy

Antworten:

3

Ich hatte kürzlich ein ähnliches Problem.

In Ihrer freetds.conf-Datei möchten Sie einen Eintrag ähnlich dem folgenden:

[DataSourceName]
        host = <IP Address>
        port = <databaseport>
        #version 8.0 seems to work  with sql server 2005
        tds version = 8.0
        client charset = UTF-8

Client-Zeichensatz ist hier das wichtige Bit.

Ich habe dies mit Perl unter Linux gemacht. Ich gehe davon aus, dass UTF-8 auch hier die beste Wahl ist, da Perl der Client ist


quelle
Cool; das hat offensichtlich etwas bewirkt. Aber jetzt bekomme ich diesen Fehler: Nicht genügend Speicher! Was in aller Welt tut es, um diese Konvertierung zu versuchen?
Skiphoppy
Ich wäre überrascht, wenn Ihnen der Speicher für die eigentliche Konvertierung ausgeht. Ich würde zuerst an anderer Stelle nach Speicherlecks / Übergrößenabfragen suchen. Ihre Freetds-Installation sollte ein Konsolen-Client-Programm namens tsql enthalten. Versuchen Sie einige Abfragen, um festzustellen, ob das Problem immer noch bei Freetds liegt.
Die Abfrage funktioniert gut von tsql. Ich weiß nicht genug über FreeTDS, um zu wissen, was anders ist. Wenn ich ein minimales Perl-Programm schreibe, das nur diese Abfrage ausführt, schlägt dies fehl. Die Abfrage erhält nur ungefähr 10 Datensätze. Ich kann mir nicht vorstellen, dass der Speicher knapp wird. Wenn ich 10 verschiedene Datensätze ohne geschweifte Anführungszeichen und dergleichen bekomme, funktioniert das einwandfrei.
Skiphoppy
Googeln deutet darauf hin, dass dies definitiv die richtige Lösung ist. Vielleicht sollte ich eine andere Frage stellen: "Wie kommt es, dass ich diesen Speicherfehler bekomme, wenn ich den Client-Zeichensatz ändere?"
Skiphoppy
2

Überprüfen Sie, ob dies hilfreich ist ( aus den Sybase-Handbüchern , funktioniert aber möglicherweise auch auf MSSQL-Servern):

Steuern der Zeichenkonvertierung während einer Sitzung

Mit set char_convert kann der Benutzer entscheiden, wie die Zeichensatzkonvertierung während einer bestimmten Arbeitssitzung funktioniert. Verwenden Sie set char_convert für:

* Set character set conversion on or off

* Start conversion into a specific character set

* Turn error reporting on or off

Die Syntax für set char_convert lautet:

setze char_convert {off |
{on [mit {error | no_error}]} | Zeichensatz [mit {Fehler | kein Fehler}]}

DVK
quelle
Sieht so aus, als wäre das nur für Sybase. Ich erhalte: DBD :: Sybase :: st Ausführung fehlgeschlagen: Servernachrichtennummer = 195 Schweregrad = 15 Status = 5 Zeile = 1 Server = XXX Text = 'char_convert' ist keine erkannte SET-Option. Ich weiß es jedoch zu schätzen.
Skiphoppy