2010-03-09 8 views
5

Ich versuche derzeit, einige Daten aus einer SQL Server-Datenbankansicht zu ziehen, die wir Zugriff von unserem Linux-Webserver eingeschränkt haben.ODBC-Abfrage auf MS SQL Server die ersten 255 Zeichen nur in PHP PDO (FreeTDS)

Wir müssen die Daten nicht bearbeiten, sondern nur auf einer Webseite anzeigen.

Alles sieht gut aus, bis wir versuchen auszugeben und nur die ersten 255 Zeichen eines Textfelds zu bekommen.

Weiß jemand, ob dies ein Problem mit FreeTDS durch PHP :: PDO verwenden oder wenn es gut funktionieren soll? Ich habe andere Leute da draußen gesehen, die ähnliche Probleme haben, aber es scheint nicht viele Antworten zu geben.

Ich verwende diese als Verbindungszeichenfolge für die MS SQL db:

$dbConn = new PDO("odbc:Driver=FreeTDS;DSN=OURDSN;UID=WWWUser;PWD=ourpassword"); 

Antwort

5

Nach den FreeTDS User Guide scheint das Problem zu sein, dass FreeTDS nur varchar bis zu 255 Zeichen verarbeiten kann, wenn auf SQL Server „wegen Beschränkungen, die in der Protokolldefinition“ sprechen. Alles, was größer ist, muss der Datentyp text sein.

Sie das Problem beheben kann entweder durch Ihr Schema entsprechend ändern oder den Datentyp bei Ihrer Anfrage Umwandlung wie folgt aus:

SELECT CAST(mycol as TEXT) FROM mytable 
+1

Ein ähnliches Problem tritt bei der Verwendung von MS ODBC in Windows Server 2016 auf SQL Server 2016 auf, obwohl der Wert mit Nullbytes alle 256 Byte zurückgegeben wird. Diese Problemumgehung behebt das Problem. Die andere Option besteht darin, 'str_replace (" \ 0 ", '', $ string)' zu verwenden, um die Nullbytes zu entfernen. –

1

Sie können die Größe der Textfelder in der /etc/odbc.ini Datei von FreeTDS verwendet erhöhen.

[name_of_connection] 
TextSize = 2097152 

Sie auch sicherstellen können versuchen, die PHP niedriges Niveau odbc Routinen, dass Sie das Niveau des Datenabrufs bekommen können, dann bis zur Verwendung von PDO der Arbeit.

+0

Wir haben das versucht, da es das einzige Ding zu sein schien, das es zu versuchen schien, aber es scheint keine Wirkung zu haben. Obwohl es durchaus möglich ist, dass ich etwas falsch mache. Müssen nach dem Ändern der odbc.ini andere Prozesse neu gestartet werden? – Del

1

FreeTDS, verwendet standardmäßig Protokoll Version 4.2 Wenn Sie sich das Protokoll zu 7.0 können Sie mehr als 255 Bytes eines Varchar abrufen. Sie können den "CAST" -Hack verwenden, oder Sie können ALTER COLUMN col varchar (max) ändern.

varchar (max) ist ein völlig anderer Spaltentyp als varchar (DATA_TYPE 2005 vs. 12) und wird über freetds 4.2 ohne Kürzung gestreamt.

Warum nicht auf Version 7 aktualisieren? Weil UTF-8 nicht in Varchar mit neueren Protokollen gespeichert werden kann. SQL Server wird ALLE Protokollinformationen in UCS-2 (wie UTF-16) übertragen und Ihre Daten vor dem Speichern in die Tabellen- oder Spaltensortierung konvertieren. Aber dies erfordert, dass Sie UTF8-Daten mit N. INSERT in TBL (txt) Werte (N'Hello Welt ')

Warum nicht CAST Präfix? CAST AS TEXT ist nicht mit MySQL kompatibel (CAST AS CHAR muss ausgeführt werden).

Bleiben Sie auf Protokoll 4.2 und der Definition Ihrer Varchars als varchar (max) Lasst uns schreiben Sie die kompatible SQL.

+0

Danke dafür, aber ich habe das vor vier Jahren gelöst und habe mit diesem Setup nichts mehr zu tun. – Del

+1

Ja, aber ich habe gerade in dieses Problem geerbt und wollte den Wissenspool erweitern. Nur für den Fall, dass immer noch Menschen Systeme erben, die auf Technologien von 1998 basieren. – chugadie

0

Noch ein Faktoid für dieses Problem. Ab 2015 führt die Rückgabe eines Werts vom Typ XML dazu, dass die ersten 25 Zeichen sauber zurückgegeben werden. Der größte Teil des restlichen XML wird jedoch als scheinbar zufälliger Müll zurückgegeben, mit einem gelegentlichen klaren Textfragment. In der Tat, wenn ich raten musste, gibt die Abfrage einen zufälligen Speicherblock für alle Zeichen nach 256 zurück.

In meinem speziellen Fall, ich generierte XML (mit mehreren FOR XML geschachtelte Abfragen) an eine Website senden für Anzeige.In diesem Fall bestand die Lösung darin, den CAST-Hack zu verwenden und die Daten nach varchar (max) zu konvertieren.

Also denken Sie daran: Wenn Sie in Ihren Abfrageergebnissen einen Block mit 256 fehlerfreien Zeichen gefolgt von zufälligen Fehlern sehen, wird wahrscheinlich ein XML-Wert als XML-Typ anstelle eines Varchar (max) -Typs zurückgegeben.

CAVEAT: Dies kann nur gelten, wenn das XML dynamisch generiert wird.