Поделиться через


Известные проблемы с драйвером ODBC в Linux и macOS

Скачать драйвер ODBC

Эта статья содержит список известных проблем в Microsoft ODBC Driver 13, 13.1, 17, 18 for SQL Server на платформах Linux и macOS. В ней также представлены шаги по устранению неполадок с подключением.

Known issues

Дополнительные проблемы см. в блоге по драйверам SQL Server.

  • Из-за ограничений системной библиотеки Alpine Linux поддерживает меньше кодировок символов и языковых стандартов. Например, недоступна кодировка en_US.UTF-8. Дополнительные сведения см. в статье musl libc - functional differences from glibc (musl libc — функциональные отличия от glibc).

  • В Windows, Linux и macOS символы из кодировки области личных символов (PUA) или символов, определяемых конечными пользователями (EUDC), могут преобразовываться по-разному. Преобразования, выполняемые на сервере в Transact-SQL, используют библиотеку преобразований Windows. Преобразования в драйвере используют библиотеки функций преобразования Windows, Linux или macOS. Каждая библиотека может создавать различные результаты при выполнении этих преобразований. Дополнительные сведения см. в статье End-User-Defined and Private Use Area Characters (Символы, определяемые конечными пользователями, и символы области личных символов).

  • Если кодировка клиента — UTF-8, то диспетчер драйверов не всегда выполняет преобразование из UTF-8 в UTF-16 должным образом. При наличии в строке недопустимых символов UTF-8 сейчас происходит повреждение данных. Символы ASCII сопоставляются правильно. Диспетчер драйверов пытается выполнить такое преобразование при вызове SQLCHAR-версий интерфейса API ODBC (например, SQLDriverConnectA). Диспетчер драйверов не пытается выполнить это преобразование при вызове версий SQLWCHAR API ODBC (например, SQLDriverConnectW).

  • Параметр SQLBindParameter ссылается на количество символов в типе SQL, а BufferLength — это количество байтов в буфере приложения. Однако если тип данных SQL — varchar(n) или char(n), приложение привязывает параметр как SQL_C_CHAR для типа C, так и для типа SQL, а SQL_CHARSQL_VARCHAR кодировка символов клиента — UTF-8, может возникнуть String data, right truncation ошибка от драйвера, даже если значение ColumnSize соответствует размеру типа данных на сервере. Эта ошибка возникает, так как преобразования между кодировками символов могут изменить длину данных. Например, правый апостроф (U+2019) кодируется в CP-1252 как однобайтовый 0x92, но в UTF-8 в виде 3-байтовой последовательности 0xE2 0x80 0x99.

Например, если кодировка UTF-8 и указана 1 для BufferLength и ColumnSizeSQLBindParameter для выходного параметра, а затем пытается получить предшествующий символ, хранящийся в char(1) столбце на сервере (с помощью CP-1252), драйвер пытается преобразовать его в 3-байтовую UTF-8 кодировку, но результат не помещается в буфер размером в 1 байт. В другом направлении он сравнивает ColumnSize с BufferLength в SQLBindParameter, прежде чем выполнить преобразование между различными кодовыми страницами на клиенте и сервере. Поскольку ColumnSize для 1 меньше, чем BufferLength , например, для 3, драйвер выдает ошибку. Чтобы избежать этой ошибки, убедитесь в том, что после преобразования данные поместятся в указанный буфер или столбец. ColumnSize не может быть больше 8000 для varchar(n) типа.

Устранение неполадок подключения

Если вы не можете подключиться к SQL Server с помощью драйвера ODBC, используйте следующие сведения, чтобы определить проблему.

Чаще всего проблема подключения связана с наличием двух установленных копий диспетчера драйверов UnixODBC. Поиск /usr для libodbc*.so*. Если отображается более одной версии файла, (возможно) установлено несколько диспетчеров драйверов. Приложение может использовать неправильную версию.

Включите журнал подключений, изменив /etc/odbcinst.ini файл, чтобы он содержал следующий раздел со следующими элементами:

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

Если возникает другой сбой подключения и файл журнала отсутствует, возможно, на компьютере имеются две копии диспетчера драйверов. В противном случае должны выводиться примерно следующие данные журнала:

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

Если для кодировки символов ASCII используется не UTF-8, например:

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

Существует несколько установленных диспетчеров драйверов, и приложение использует неправильный или диспетчер драйверов не был создан правильно.

При использовании драйверов версии до 17.8 у некоторых пользователей macOS возникает следующая ошибка:

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

Эта ошибка может возникать при установленной библиотеке OpenSSL 3.0. OpenSSL обычно устанавливается через Homebrew и содержит двоичные файлы: openssl, [email protected], и openssl@3.

Чтобы устранить эту ошибку, измените связь двоичного файла OpenSSL следующим образом [email protected]:

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

Дополнительные сведения об устранении неполадок подключения см. в статьях: