Problèmes connus concernant le pilote ODBC sur Linux et macOS

Télécharger le pilote ODBC

Cet article contient une liste de problèmes connus avec Microsoft ODBC Driver 13, 13.1, 17 et 18 for SQL Server sur Linux et macOS. Il contient aussi les étapes permettant de résoudre les problèmes de connectivité.

Problèmes connus

D’autres problèmes seront abordés sur le blog SQL Server Drivers.

  • En raison des limitations de la bibliothèque système, Alpine Linux prend en charge moins de codages de caractères et de paramètres régionaux. Par exemple, en_US.UTF-8 n’est pas disponible. Pour plus d’informations, consultez Différences fonctionnelles de musl libc par rapport à glibc.

  • Windows, Linux et macOS convertissent différemment des caractères de la zone PUA (Private Use Area) ou des caractères EUDC (End User-Defined Characters). Les conversions effectuées sur le serveur dans Transact-SQL utilisent la bibliothèque de conversion Windows. Les conversions dans le pilote utilisent les bibliothèques de conversion Windows, Linux ou macOS. Chaque bibliothèque peut produire des résultats différents lors de l’exécution de ces conversions. Pour plus d’informations, voir Caractères End-User-Defined et Private Use Area.

  • Si l’encodage client est UTF-8, le gestionnaire de pilotes n’effectue pas toujours une bonne conversion d’UTF-8 en UTF-16. Les données sont endommagées quand un ou plusieurs caractères dans la chaîne ne sont pas des caractères UTF-8 valides. Les caractères ASCII sont mappés correctement. Le Gestionnaire de pilotes essaie d’effectuer cette conversion lors de l’appel des versions SQLCHAR de l’API ODBC (par exemple, SQLDriverConnectA). Le gestionnaire de pilotes n’essaie pas d’effectuer cette conversion lors de l’appel des versions SQLWCHAR de l’API ODBC (par exemple, SQLDriverConnectW).

  • Le paramètre ColumnSize de SQLBindParameter fait référence au nombre de caractères dans le type SQL, tandis que BufferLength est le nombre d’octets dans la mémoire tampon de l’application. Toutefois, si le type de données SQL est varchar(n) ou char(n), si l’application lie le paramètre en tant que SQL_C_CHAR pour le type C et SQL_CHAR ou SQL_VARCHAR pour le type SQL, et que l’encodage de caractères du client est UTF-8, le pilote peut retourner l’erreur « Troncation à droite de la chaîne de données » même si la valeur de ColumnSize est alignée sur la taille du type de données sur le serveur. Cette erreur se produit dans la mesure où les conversions entre les encodages de caractères peuvent changer la longueur des données. Par exemple, un caractère d’apostrophe droite (U+2019) est encodé en CP-1252 comme 0x92 sur un octet, mais en UTF-8 comme séquence 0xe2 0x80 0x99 sur trois octets.

Par exemple, si votre encodage est UTF-8 et que vous spécifiez 1 pour BufferLength et ColumnSize dans SQLBindParameter pour un paramètre de sortie, puis que vous essayez de récupérer le caractère précédent stocké dans une colonne char(1) sur le serveur (à l’aide de CP-1252), le pilote tente de le convertir dans l’encodage UTF-8 sur 3 octets, mais ne peut pas faire tenir le résultat dans une mémoire tampon d’un octet. Dans l’autre sens, il compare ColumnSize à BufferLength dans SQLBindParameter avant d’effectuer la conversion entre les différentes pages de codes sur le client et le serveur. Étant donné qu’une ColumnSize de 1 est inférieure à une BufferLength de 3 (par exemple), le pilote génère une erreur. Pour éviter cette erreur, vérifiez que la longueur des données après la conversion est adaptée à la colonne ou mémoire tampon spécifiée. Notez que ColumnSize ne peut pas être supérieure à 8000 pour le type varchar(n).

Résolution des problèmes de connexion

Si vous ne parvenez pas à établir de connexion à SQL Server à l’aide du pilote ODBC, utilisez les informations suivantes pour identifier le problème.

Le problème de connexion le plus courant est dû à l’installation de deux copies du gestionnaire de pilotes UnixODBC. Recherchez libodbc*.so * dans /usr. Si plusieurs versions du fichier apparaissent, vous avez (probablement) plusieurs gestionnaires de pilotes installés. Votre application risque alors d’utiliser la mauvaise version.

Activez le journal de connexion en modifiant votre fichier /etc/odbcinst.ini afin qu’il contienne la section suivante avec les éléments ci-après :

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

Si vous obtenez un autre échec de connexion et que vous ne voyez pas de fichier journal, il existe (peut-être) deux copies du gestionnaire de pilotes sur votre ordinateur. Sinon, la sortie du journal doit ressembler à :

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

Si l’encodage de caractères ASCII n’est pas UTF-8, par exemple :

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

Plusieurs gestionnaires de pilotes sont installés et votre application n’utilise pas le bon, ou le gestionnaire de pilotes n’a pas été créé correctement.

Certains utilisateurs macOS rencontrent l’erreur suivante avec la version 17.8 du pilote ou une version antérieure :
(Cette erreur a été résolue dans la version 17.9+ du pilote)

[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’erreur peut se produire lors de l’installation d’OpenSSL 3.0. OpenSSL est généralement installé via Brew et contient les binaires openssl, openssl@1.1 et openssl@3.

Pour résoudre cette erreur, remplacez le lien symbolique du binaire openssl par 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

Pour plus d’informations sur la résolution des échecs de connexion, consultez :

Étapes suivantes

Pour obtenir des instructions d’installation du pilote ODBC, consultez les articles suivants :

Pour plus d’informations, consultez les instructions de programmation et les notes de publication.