Delen via


Bekende problemen voor het ODBC-stuurprogramma in Linux en macOS

ODBC-stuurprogramma downloaden

Dit artikel bevat een lijst met bekende problemen met het Microsoft ODBC-stuurprogramma 13, 13.1, 17 en 18 voor SQL Server op Linux en macOS. Het bevat ook stappen voor het oplossen van verbindingsproblemen.

Known issues

Voor aanvullende problemen, zie de SQL Server-blog.

  • Vanwege systeembibliotheekbeperkingen ondersteunt Alpine Linux minder tekencoderingen en landinstellingen. Is bijvoorbeeld en_US.UTF-8 niet beschikbaar. Zie voor meer informatie musl libc - functionele verschillen van glibc.

  • Windows, Linux en macOS converteren tekens uit het gebied voor privégebruik (PUA) of eindgebruikersgedefinieerde tekens (EUDC) op verschillende manieren. Conversies die worden uitgevoerd op de server binnen Transact-SQL de Windows-conversiebibliotheek gebruiken. Conversies in het stuurprogramma maken gebruik van de Windows-, Linux- of macOS-conversiebibliotheken. Elke bibliotheek kan verschillende resultaten opleveren bij het uitvoeren van deze conversies. Zie voor meer informatie Gebruikersgedefinieerde- en Privégebruik-gebiedtekens.

  • Als de clientcodering UTF-8 is, converteert de stuurprogrammamanager niet altijd correct van UTF-8 naar UTF-16. Gegevensbeschadiging treedt momenteel op wanneer een of meer tekens in de tekenreeks geen geldige UTF-8 tekens zijn. ASCII-tekens worden correct toegewezen. De stuurprogrammabeheerder probeert deze conversie uit te voeren bij het aanroepen van de SQLCHAR-versies van de ODBC-API (bijvoorbeeld SQLDriverConnectA). De stuurprogrammabeheerder probeert deze conversie niet uit te voeren bij het aanroepen van de SQLWCHAR-versies van de ODBC-API (bijvoorbeeld SQLDriverConnectW).

  • De parameter SQLBindParameter verwijst naar het aantal tekens in het SQL-type, terwijl BufferLength het aantal bytes in de buffer van de toepassing is. Als het SQL-gegevenstype echter varchar(n) of char(n) is, koppelt de toepassing de parameter als SQL_C_CHAR voor het C-type en als SQL_CHAR of SQL_VARCHAR voor het SQL-type, en de tekencodering van de client is UTF-8, dan kunt u mogelijk een String data, right truncation fout ontvangen van het stuurprogramma, zelfs als de waarde van ColumnSize is uitgelijnd met de grootte van het gegevenstype op de server. Deze fout treedt op omdat conversies tussen tekencoderingen de lengte van de gegevens kunnen wijzigen. Een rechts apostrofteken (U+2019) wordt bijvoorbeeld gecodeerd in CP-1252 als de single-byte 0x92, maar in UTF-8 als de 3-bytereeks 0xE2 0x80 0x99.

Als uw codering bijvoorbeeld UTF-8 is en u 1 opgeeft voor zowel BufferLength als ColumnSizeSQLBindParameter voor een outparameter, en vervolgens probeert het voorgaande teken op te halen dat is opgeslagen in een char(1) kolom op de server (met CP-1252), probeert het stuurprogramma het te converteren naar de 3-byte UTF-8-codering, maar kan het resultaat niet in een buffer van 1 byte passen. In de andere richting vergelijkt ColumnSize met BufferLength in SQLBindParameter voordat de conversie tussen de verschillende codepagina's op de client en de server plaatsvindt. Omdat een kolomgrootte van 1 kleiner is dan een BufferLength van (bijvoorbeeld) 3, genereert het stuurprogramma een fout. Om deze fout te voorkomen, moet u ervoor zorgen dat de lengte van de gegevens na conversie in de opgegeven buffer of kolom past. ColumnSize mag niet groter zijn dan 8000 voor het varchar(n) type.

Verbindingsproblemen oplossen

Als u geen verbinding kunt maken met SQL Server met behulp van het ODBC-stuurprogramma, gebruikt u de volgende informatie om het probleem te identificeren.

Het meest voorkomende verbindingsprobleem is het installeren van twee exemplaren van het UnixODBC-stuurprogrammabeheer. Zoek /usr naar libodbc*.so*. Als u meer dan één versie van het bestand ziet, hebt u (mogelijk) meerdere stuurprogrammamanagers geïnstalleerd. Uw toepassing kan de verkeerde versie gebruiken.

Schakel het verbindingslogboek in door het /etc/odbcinst.ini bestand te bewerken en de volgende sectie met deze items te bevatten:

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

Als u een andere verbindingsfout krijgt en er geen logboekbestand wordt weergegeven, zijn er (mogelijk) twee kopieën van het stuurprogrammabeheer op uw computer. Anders moet de logboekuitvoer vergelijkbaar zijn met:

[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'

Als de ASCII-tekencodering geen UTF-8 is, bijvoorbeeld:

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

Er is meer dan één stuurprogrammabeheer geïnstalleerd en uw toepassing gebruikt het verkeerde stuurprogramma of de stuurprogrammamanager is niet correct gebouwd.

Sommige macOS-gebruikers krijgen de volgende fout met stuurprogrammaversie 17.8 of ouder:

[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)

De fout kan optreden wanneer OpenSSL 3.0 is geïnstalleerd. OpenSSL wordt doorgaans geïnstalleerd via Homebrew en bevat de openssl, openssl@1.1en openssl@3 binaire bestanden.

Als u deze fout wilt oplossen, wijzigt u de symlink van het binaire OpenSSL-bestand 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

Zie voor meer informatie over het oplossen van verbindingsfouten: