Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта статья содержит список известных проблем в 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 fromglibc
(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_CHAR
SQL_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
Related tasks
Дополнительные сведения об устранении неполадок подключения см. в статьях:
- Шаги для устранения неполадок с подключением SQL
- Устранение проблем с подключением в SQL Server 2005 — часть I
- Устранение проблем с подключением в SQL Server 2008 с помощью кольцевого буфера подключения
- Средство устранения неполадок проверки подлинности SQL Server