Problemi noti per il driver ODBC in Linux e macOS

Scaricare il driver ODBC

Questo argomento contiene un elenco di problemi noti relativi a Microsoft ODBC Driver for SQL Server 13, 13.1, 17 e 18 in Linux e macOS. Contiene anche i passaggi per la risoluzione dei problemi di connettività.

Problemi noti

Ulteriori problemi verranno pubblicati nel blog sui driver di SQL Server.

  • A causa delle limitazioni della libreria di sistema, Alpine Linux supporta meno codifiche di caratteri e impostazioni locali. Ad esempio, en_US.UTF-8 non è disponibile. Per altre informazioni, vedere musl libc - Differenze funzionali da glibc.

  • Windows, Linux e macOS convertono i caratteri provenienti dall'Area uso privato (PUA) o i caratteri definiti dall'utente finale (EUDC) in modo diverso. Per le conversioni eseguite sul server all'interno di Transact-SQL viene usata la libreria di conversione Windows. Le conversioni eseguite nel driver usano le librerie di conversione Windows, Linux o macOS. Le conversioni eseguite con le due librerie possono produrre risultati diversi. Per altre informazioni, vedere End-User-Defined and Private Use Area Characters (Caratteri definiti dall'utente finale e caratteri di area uso privato).

  • Se la codifica del client è UTF-8, Gestione driver non esegue sempre correttamente la conversione da UTF-8 a UTF-16. Attualmente se uno o più caratteri della stringa non sono caratteri UTF-8 validi, i dati vengono danneggiati. I caratteri ASCII vengono mappati correttamente. Gestione driver tenta questa conversione quando si chiamano le versioni SQLCHAR dell'API ODBC (ad esempio, SQLDriverConnectA). Gestione driver non tenterà questa conversione quando si chiamano le versioni SQLWCHAR dell'API ODBC (ad esempio, SQLDriverConnectW).

  • Il parametro ColumnSize di SQLBindParameter fa riferimento al numero di caratteri nel tipo SQL, mentre BufferLength è il numero di byte nel buffer dell'applicazione. Se tuttavia il tipo di dati SQL è varchar(n) o char(n), se l'applicazione associa il parametro come SQL_C_CHAR per il tipo C e SQL_CHAR o SQL_VARCHAR per il tipo SQL e se la codifica dei caratteri del client è UTF-8, è possibile che si verifichi un errore "Troncamento a destra della stringa di dati" nel driver anche se il valore di ColumnSize è allineato con la dimensione del tipo di dati nel server. Questo errore si verifica perché le conversioni tra codifiche di caratteri possono cambiare la lunghezza dei dati. Ad esempio un carattere virgoletta singola destra (U+2019) è codificato in CP-1252 come 0x92 a byte singolo, mentre in UTF-8 è codificato come sequenza a tre byte 0xe2 0x80 0x99.

Ad esempio se la codifica è UTF-8 e si specifica 1 sia per BufferLength sia per ColumnSize in SQLBindParameter per un parametro out, quindi si prova a recuperare il carattere precedente archiviato in una colonna char(1) nel server (usando CP-1252), il driver tenta di convertirlo alla codifica UTF-8 a 3 byte, ma non può adattare il risultato in un buffer di 1 byte. Nella direzione opposta, ColumnSize viene confrontato con BufferLength in SQLBindParameter prima della conversione tra le diverse tabelle codici su client e server. Poiché il valore 1 di ColumnSize è minore di un valore BufferLength di 3 (ad esempio), il driver genera un errore. Per evitare questo errore, verificare che la lunghezza dei dati dopo la conversione si adatti correttamente al buffer o alla colonna specificati. Si noti che ColumnSize non può essere maggiore di 8000 per il tipo varchar(n).

Risoluzione dei problemi di connessione

Se non si riesce a stabilire una connessione a SQL Server tramite il driver ODBC, usare le informazioni seguenti per individuare il problema.

Il problema di connessione più comune è legato alla presenza di due copie di Gestione driver UnixODBC installate. Cercare /usr for libodbc*.so*. Se è presente più di una versione del file, è possibile che esistano più installazioni di Gestione driver. L'applicazione potrebbe utilizzare la versione non corretta.

Abilitare il log della connessione modificando il file /etc/odbcinst.ini affinché contenga la sezione seguente con questi elementi:

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

Se viene generato un altro errore di connessione e il file di registro non è visualizzato, è possibile che nel computer in uso esistano due copie di Gestione driver. In caso contrario, l'output del log avrà un aspetto analogo a:

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

Se la codifica dei caratteri ASCII è diversa da UTF-8, ad esempio:

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

Sono installate più copie di Gestione driver e l'applicazione usa quella sbagliata oppure Gestione driver non è stato compilato correttamente.

Alcuni utenti macOS riscontrano l'errore seguente con il driver versione 17.8 o precedente:
(Questo errore è stato risolto nella versione del driver 17.9 e successive)

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

L'errore può verificarsi quando è installato OpenSSL 3.0. OpenSSL viene in genere installato tramite Brew e contiene i file binari openssl, openssl@1.1 e openssl@3.

Per risolvere questo errore, modificare il collegamento simbolico del file binario openssl 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

Per altre informazioni sulla risoluzione dei problemi di connessione, vedere:

Passaggi successivi

Per le istruzioni di installazione per il driver ODBC, vedere gli articoli seguenti:

Per altre informazioni, vedere le linee guida per la programmazione e le note sulla versione.