Dela via


Kända problem för ODBC-drivrutinen i Linux och macOS

Ladda ned ODBC-drivrutins

Den här artikeln innehåller en lista över kända problem med Microsoft ODBC Driver 13, 13.1, 17 och 18 för SQL Server i Linux och macOS. Den innehåller också steg för att felsöka anslutningsproblem.

Known issues

Ytterligare problem finns i sql Server-drivrutinsbloggen.

  • På grund av systembiblioteksbegränsningar stöder Alpine Linux färre teckenkodningar och nationella inställningar. Det är till exempel en_US.UTF-8 inte tillgängligt. Mer information finns i musl libc – funktionella skillnader från glibc.

  • Windows, Linux och macOS konverterar tecken från det privata användningsområdet (PUA) eller End User-Defined Characters (EUDC) på olika sätt. Konverteringar som utförs på servern i Transact-SQL använda Windows-konverteringsbiblioteket. Konverteringar i drivrutinen använder konverteringsbiblioteken för Windows, Linux eller macOS. Varje bibliotek kan ge olika resultat när du utför dessa konverteringar. Mer information finns i Slutanvändardefinierade och tecken för privat användning.

  • Om klientkodningen är UTF-8 konverterar inte drivrutinshanteraren alltid korrekt från UTF-8 till UTF-16. För närvarande uppstår dataskada när ett eller flera tecken i strängen inte är giltiga UTF-8 tecken. ASCII-tecken mappas korrekt. Drivrutinshanteraren försöker utföra den här konverteringen när sqlchar-versionerna av ODBC-API:et anropas (till exempel SQLDriverConnectA). Drivrutinshanteraren försöker inte utföra den här konverteringen när du anropar SQLWCHAR-versionerna av ODBC-API:et (till exempel SQLDriverConnectW).

  • Parametern SQLBindParameter i refererar till antalet tecken i SQL-typen, medan BufferLength är antalet byte i programmets buffert. Men om SQL-datatypen är varchar(n) eller char(n), programmet binder parametern som SQL_C_CHAR för C-typen och SQL_CHAR eller SQL_VARCHAR för SQL-typen, och teckenkodningen för klienten är UTF-8, kan du få ett String data, right truncation fel från drivrutinen även om värdet för ColumnSize är justerat med storleken på datatypen på servern. Det här felet uppstår eftersom konverteringar mellan teckenkodningar kan ändra datalängden. Till exempel kodas ett höger apostrofertecken (U+2019) i CP-1252 som enkel byte 0x92, men i UTF-8 som 3-byte-sekvensen 0xE2 0x80 0x99.

Om din kodning till exempel är UTF-8 och du anger 1 för både BufferLength och ColumnSize i SQLBindParameter för en out-parameter och sedan försöker hämta föregående tecken som lagras i en char(1) kolumn på servern (med CP-1252) försöker drivrutinen konvertera det till kodningen 3 byte UTF-8, men får inte plats med resultatet i en buffert på 1 byte. I den andra riktningen jämförs ColumnSize med BufferLength i SQLBindParameter innan konverteringen mellan de olika kodsidorna på klienten och servern. Eftersom en ColumnSize på 1 är mindre än en BufferLength av (till exempel) 3 genererar drivrutinen ett fel. Undvik det här felet genom att se till att längden på data efter konverteringen passar in i den angivna bufferten eller kolumnen. ColumnSize får inte vara större än 8 000 för varchar(n) typen.

Felsöka anslutningsproblem

Om du inte kan upprätta en anslutning till SQL Server med hjälp av ODBC-drivrutinen använder du följande information för att identifiera problemet.

Det vanligaste anslutningsproblemet är att ha två kopior av UnixODBC-drivrutinshanteraren installerad. Sök /usr efter libodbc*.so*. Om du ser mer än en version av filen har du (möjligen) fler än en drivrutinshanterare installerad. Programmet kan använda fel version.

Aktivera anslutningsloggen genom att redigera /etc/odbcinst.ini filen så att den innehåller följande avsnitt med följande objekt:

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

Om du får ett annat anslutningsfel och inte ser någon loggfil finns det (möjligen) två kopior av drivrutinshanteraren på datorn. Annars bör loggutdata se ut ungefär så här:

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

Om ASCII-teckenkodningen inte är UTF-8, till exempel:

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

Det finns fler än en drivrutinshanterare installerad och ditt program använder fel, eller så har drivrutinshanteraren inte skapats korrekt.

Vissa macOS-användare stöter på följande fel med drivrutinsversion 17.8 eller senare:

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

Felet kan inträffa när OpenSSL 3.0 har installerats. OpenSSL installeras vanligtvis via Homebrew och innehåller binärfilerna openssl, openssl@1.1och openssl@3 .

Lös det här felet genom att ändra symlinken för OpenSSL-binärfilen till 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

Mer information om hur du löser anslutningsfel finns i: