Partilhar via


Problemas conhecidos do driver ODBC no Linux e macOS

Baixar driver ODBC

Este artigo contém uma lista de problemas conhecidos com o Microsoft ODBC Driver 13, 13.1, 17 e 18 para SQL Server no Linux e macOS. Ele também contém etapas para solucionar problemas de conectividade.

Known issues

Para problemas adicionais, consulte o blog Drivers do SQL Server.

  • Devido às limitações da biblioteca do sistema, o Alpine Linux suporta menos codificações de caracteres e localidades. Por exemplo, en_US.UTF-8 não está disponível. Para obter mais informações, consulte musl libc - diferenças funcionais de glibc.

  • Windows, Linux e macOS convertem caracteres da Área de Uso Privado (PUA) ou Caracteres Definidos pelo Utilizador Final (EUDC) de forma diferente. As conversões realizadas no servidor dentro do Transact-SQL usam a biblioteca de conversões do Windows. As conversões no driver usam as bibliotecas de conversão do Windows, Linux ou macOS. Cada biblioteca pode produzir resultados diferentes ao executar essas conversões. Para obter mais informações, consulte Caracteres Definidos pelo Utilizador e de Área de Uso Privado.

  • Se a codificação do cliente for UTF-8, o gerenciador de driver nem sempre converte corretamente de UTF-8 para UTF-16. Atualmente, a corrupção de dados ocorre quando um ou mais caracteres na cadeia de caracteres não são caracteres UTF-8 válidos. Os caracteres ASCII são mapeados corretamente. O gerenciador de driver tenta essa conversão ao chamar as versões SQLCHAR da API ODBC (por exemplo, SQLDriverConnectA). O gerenciador de driver não tenta essa conversão ao chamar as versões SQLWCHAR da API ODBC (por exemplo, SQLDriverConnectW).

  • O parâmetro ColumnSize de SQLBindParameter refere-se ao número de caracteres no tipo SQL, enquanto BufferLength é o número de bytes no buffer do aplicativo. No entanto, se o tipo de dados SQL for varchar(n) ou char(n), a aplicação liga o parâmetro como SQL_C_CHAR para o tipo C e como SQL_CHAR ou SQL_VARCHAR para o tipo SQL, e se a codificação de caracteres do cliente for UTF-8, poderá ocorrer um erro String data, right truncation do driver, mesmo que o valor de ColumnSize esteja alinhado com o tamanho do tipo de dados no servidor. Este erro ocorre uma vez que as conversões entre codificações de caracteres podem alterar o comprimento dos dados. Por exemplo, um caractere apóstrofo direito (U+2019) é codificado em CP-1252 como o byte 0x92único, mas em UTF-8 como a sequência 0xE2 0x80 0x99de 3 bytes.

Por exemplo, se a codificação for UTF-8 e especificar 1 para BufferLength e ColumnSize em SQLBindParameter para um parâmetro de saída, e tentar recuperar o caractere anterior armazenado em uma char(1) coluna no servidor (usando CP-1252), o driver tentará convertê-lo para a codificação UTF-8 de 3 bytes, mas não consegue acomodar o resultado em um buffer de 1 byte. Na outra direção, ele compara ColumnSize com o BufferLength antes SQLBindParameter de fazer a conversão entre as diferentes páginas de código no cliente e no servidor. Como um ColumnSize de 1 é menor que um BufferLength de (por exemplo) 3, o driver gera um erro. Para evitar esse erro, verifique se o comprimento dos dados após a conversão se encaixa no buffer ou coluna especificados. ColumnSize não pode ser maior que 8000 para o varchar(n) tipo.

Solucionar problemas de conexão

Se você não conseguir fazer uma conexão com o SQL Server usando o driver ODBC, use as informações a seguir para identificar o problema.

O problema de conexão mais comum é ter duas cópias do gerenciador de driver UnixODBC instalado. Pesquise /usr por libodbc*.so*. Se você vir mais de uma versão do arquivo, você (possivelmente) tem mais de um gerenciador de driver instalado. Seu aplicativo pode usar a versão errada.

Habilite o log de conexão editando seu /etc/odbcinst.ini arquivo, para conter a seguinte seção com estes itens:

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

Se tiveres outra falha de conexão e não vires um arquivo de log, pode haver (possivelmente) duas cópias do gestor de drivers no teu computador. Caso contrário, a saída do log deve ser semelhante 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 a codificação de caracteres ASCII não for UTF-8, por exemplo:

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

Há mais de um gerenciador de driver instalado e seu aplicativo está usando o errado, ou o gerenciador de driver não foi construído corretamente.

Alguns usuários do macOS encontram o seguinte erro com a versão do driver 17.8 ou anterior:

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

O erro pode acontecer quando o OpenSSL 3.0 está instalado. OpenSSL normalmente é instalado através do Homebrew, e contém o openssl, openssl@1.1e openssl@3 binários.

Para resolver esse erro, altere o link simbólico do binário OpenSSL para 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

Para obter mais informações sobre como resolver falhas de conexão, consulte: