Bekannte Probleme des ODBC-Treibers unter Linux und macOS

ODBC-Treiber herunterladen

Dieser Artikel enthält eine Liste der bekannten Probleme mit Microsoft ODBC Driver 13, 13.1, 17 und 18 for SQL Server unter Linux und macOS. Außerdem enthält er Schritte zur Behandlung von Konnektivitätsproblemen.

Bekannte Probleme

Weitere Probleme werden im Blog zu SQL Server-Treibern veröffentlicht.

  • Aufgrund von Einschränkungen der Systembibliothek unterstützt Alpine Linux weniger Zeichencodierungen und Schemas. en_US.UTF-8 ist beispielsweise nicht verfügbar. Weitere Informationen finden Sie unter musl libc: Funktionsbezogene Unterschiede zu glibc.

  • Windows, Linux und macOS konvertieren Zeichen aus der Private Use Area oder benutzerdefinierte Zeichen unterschiedlich. Konvertierungen, die auf dem Server in Transact-SQL ausgeführt werden, verwenden die Microsoft-Konvertierungsbibliothek. Konvertierungen im Treiber verwenden die Konvertierungsbibliotheken von Windows, Linux oder macOS. Jede dieser Bibliotheken führt möglicherweise zu unterschiedlichen Ergebnissen, wenn die Konvertierung ausgeführt wird. Weitere Informationen finden Sie unter EUDC-Zeichen und Zeichen des benutzerdefinierten Bereichs.

  • Wenn der Client die UTF-8-Codierung aufweist, führt der Treiber-Manager die Konvertierung von UTF-8 in UTF-16 nicht immer ordnungsgemäß durch. Derzeit tritt Datenbeschädigung auf, wenn mindestens ein Zeichen in der Zeichenfolge kein gültiges UTF-8-Zeichen ist. ASCII-Zeichen werden ordnungsgemäß zugeordnet. Der Treiber-Manager versucht, diese Konvertierung beim Aufruf der SQLCHAR-Versionen der ODBC-API (z.B. SQLDriverConnectA) durchzuführen. Der Treiber-Manager versucht nicht, diese Konvertierung beim Aufruf der SQLWCHAR-Versionen der ODBC-API (zum Beispiel SQLDriverConnectW) durchzuführen.

  • Der Parameter ColumnSize von SQLBindParameter bezieht sich auch die Anzahl von Zeichen im SQL-Typ, während BufferLength der Anzahl von Bytes im Puffer der Anwendung entspricht. Wenn jedoch der SQL-Datentyp varchar(n) oder char(n) ist und die Anwendung den Parameter als SQL_C_CHAR für den C-Typ und SQL_CHAR oder SQL_C_VARCHAR für den SQL-Typ bindet und zugleich der Client die Zeichencodierung UTF-8 verwendet, erhalten Sie vom Treiber eventuell die Fehlermeldung „Die Zeichenfolgedaten wurden rechts abgeschnitten.“, selbst wenn der Wert von ColumnSize auf die Größe des Datentyps auf dem Server ausgerichtet ist. Dieser Fehler tritt auf, weil Konvertierungen zwischen Zeichencodierungen die Länge der Daten ändern können. Ein rechtes Anführungszeichen (U+2019) wird beispielsweise in CP-1252 als das einzelne Byte „0x92“ codiert, während es in der UTF-8-Codierung jedoch als Sequenz der drei Bytes „0xe2“, „0x80“ und „0x99“ codiert wird.

Wenn Sie beispielsweise die UTF-8-Codierung verwenden, „1“ für BufferLength und ColumnSize für einen Out-Parameter in SQLBindParameter angeben und anschließend versuchen, das vorhergehende Zeichen abzurufen, das auf dem Server in einer char(1)-Spalte gespeichert ist (mit CP-1252), versucht der Treiber, ihn in die UTF-8-Codierung mit drei Bytes zu konvertieren. Das Ergebnis passt jedoch nicht in einen Puffer mit einem Byte. Andererseits wird ColumnSize mit dem Wert von BufferLength in SQLBindParameter verglichen, bevor die Konvertierung zwischen den verschiedenen Codepages für den Client und den Server durchgeführt wird. Da ein ColumnSize von 1 kleiner ist als eine Pufferlänge von (z. B.) 3, generiert der Treiber einen Fehler. Stellen Sie sicher, dass die Länge der Daten nach der Konvertierung in den angegebenen Puffer oder die Spalte passt, um diesen Fehler zu vermeiden. Beachten Sie, dass der Wert von ColumnSize mit dem Typ varchar(n) nicht größer als 8000 sein darf.

Beheben von Verbindungsproblemen

Falls Sie keine Verbindung mittels ODBC-Treiber mit SQL Server herstellen können, verwenden Sie die folgenden Informationen, um das Problem zu identifizieren.

Das häufigste Verbindungsproblem besteht darin, dass der unixODBC-Treiber-Manager doppelt installiert wurde. Durchsuchen Sie „/usr“ nach „libodbc*.so*“. Falls Sie mehr als eine Version der Datei sehen, haben Sie (möglicherweise) mehr als einen Treiber-Manager installiert. Ihre Anwendung verwendet eventuell die falsche Version.

Aktivieren Sie das Verbindungsprotokoll, indem Sie Ihre /etc/odbcinst.ini-Datei so bearbeiten, dass Sie den folgenden Bereich mit diesen Elementen enthält:

[ODBC]
Trace = Yes
TraceFile = (path to log file, or /dev/stdout to output directly to the terminal)

Falls wieder ein Verbindungsfehler auftritt und Ihnen keine Protokolldatei angezeigt wird, gibt es (möglicherweise) zwei Kopien des Treiber-Managers auf Ihrem Computer. Andernfalls sollte die Ausgabe des Protokolls etwa so aussehen:

[ODBC][28783][1321576347.077780][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0x17c858e0
            Window Hdl = (nil)
            Str In = [DRIVER={ODBC Driver 18 for SQL Server};SERVER={contoso.com};Trusted_Connection={YES};WSID={mydb.contoso.com};AP...][length = 139 (SQL_NTS)]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = (nil)
            Completion = 0
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'

Falls die ASCII-Zeichencodierung beispielsweise nicht UTF-8 ist:

UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'

Mehr als ein Treiber-Manager ist installiert, und Ihre Anwendung verwendet den falschen, oder der Treiber-Manager wurde nicht korrekt erstellt.

Bei einigen macOS-Benutzern tritt der folgende Fehler mit Treiberversion 17.8 oder früher auf:
(Dieser Fehler wurde in Treiberversion 17.9 und höher behoben.)

[08001][Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [OpenSSL library could not be loaded, make sure OpenSSL 1.0 or 1.1 is installed]
[08001][Microsoft][ODBC Driver 17 for SQL Server]Client unable to establish connection (0) (SQLDriverConnect)

Der Fehler kann auftreten, wenn OpenSSL 3.0 installiert ist. OpenSSL wird in der Regel über Brew installiert und enthält die Binärdateien openssl, openssl@1.1 und openssl@3.

Um diesen Fehler zu beheben, ändern Sie den Symlink der openssl-Binärdatei in openssl@1.1:

rm -rf $(brew --prefix)/opt/openssl
version=$(ls $(brew --prefix)/Cellar/openssl@1.1 | grep "1.1")
ln -s $(brew --prefix)/Cellar/openssl@1.1/$version $(brew --prefix)/opt/openssl

Weitere Informationen zum Beheben von Verbindungsproblemen finden Sie hier:

Nächste Schritte

Installationsanweisungen für den ODBC-Treiber finden Sie in den folgenden Artikeln:

Weitere Informationen finden Sie in den Programmierrichtlinien und den Versionshinweisen.