Bagikan melalui


Masalah umum untuk driver ODBC di Linux dan macOS

Unduh driver ODBC

Artikel ini berisi daftar masalah yang diketahui dengan Microsoft ODBC Driver 13, 13.1, 17, dan 18 untuk SQL Server di Linux dan macOS. Ini juga berisi langkah-langkah untuk memecahkan masalah konektivitas.

Masalah umum

Masalah tambahan akan diposting di blog Driver SQL Server.

  • Karena keterbatasan pustaka sistem, Alpine Linux mendukung lebih sedikit pengodean karakter dan lokal. Misalnya, en_US.UTF-8 tidak tersedia. Untuk informasi selengkapnya, lihat musl libc - perbedaan glibcfungsi dari .

  • Windows, Linux, dan macOS mengonversi karakter dari Private Use Area (PUA) atau End User-Defined Characters (EUDC) secara berbeda. Konversi yang dilakukan pada server dalam Transact-SQL menggunakan pustaka konversi Windows. Konversi di driver menggunakan pustaka konversi Windows, Linux, atau macOS. Setiap pustaka dapat menghasilkan hasil yang berbeda saat melakukan konversi ini. Untuk informasi selengkapnya, lihat Karakter Area Yang Ditentukan Pengguna Akhir dan Penggunaan Privat.

  • Jika pengodean klien adalah UTF-8, manajer driver tidak selalu mengonversi dengan benar dari UTF-8 ke UTF-16. Saat ini, kerusakan data terjadi ketika satu atau beberapa karakter dalam string tidak valid karakter UTF-8. Karakter ASCII dipetakan dengan benar. Manajer driver mencoba konversi ini saat memanggil versi SQLCHAR DARI ODBC API (misalnya, SQLDriverConnectA). Manajer driver tidak akan mencoba konversi ini saat memanggil versi SQLWCHAR DARI ODBC API (misalnya, SQLDriverConnectW).

  • Parameter ColumnSize SQLBindParameter mengacu pada jumlah karakter dalam jenis SQL, sedangkan BufferLength adalah jumlah byte dalam buffer aplikasi. Namun, jika jenis data SQL adalah varchar(n) atau char(n), aplikasi mengikat parameter sebagai SQL_C_CHAR untuk jenis C, dan SQL_CHAR atau SQL_VARCHAR untuk jenis SQL, dan pengodean karakter klien adalah UTF-8, Anda mungkin mendapatkan kesalahan "Data string, pemotongan yang tepat" dari driver bahkan jika nilai ColumnSize selaras dengan ukuran jenis data di server. Kesalahan ini terjadi karena konversi antara pengodean karakter dapat mengubah panjang data. Misalnya, karakter apostrof kanan (U+2019) dikodekan dalam CP-1252 sebagai 0x92 byte tunggal, tetapi dalam UTF-8 sebagai urutan 3 byte 0xe2 0x80 0x99.

Misalnya, jika pengodean Anda adalah UTF-8 dan Anda menentukan 1 untuk BufferLength dan ColumnSize di SQLBindParameter untuk parameter luar, dan kemudian mencoba untuk mengambil karakter sebelumnya yang char(1) disimpan dalam kolom di server (menggunakan CP-1252), driver mencoba mengonversinya ke pengodean UTF-8 3 byte, tetapi tidak dapat memasukkan hasilnya ke dalam buffer 1-byte. Di arah lain, ia membandingkan ColumnSize dengan BufferLength di SQLBindParameter sebelum melakukan konversi antara halaman kode yang berbeda di klien dan server. Karena ColumnSize 1 kurang dari BufferLength dari (misalnya) 3, driver menghasilkan kesalahan. Untuk menghindari kesalahan ini, pastikan bahwa panjang data setelah konversi sesuai dengan buffer atau kolom yang ditentukan. Perhatikan bahwa ColumnSize tidak boleh lebih besar dari 8000 untuk jenis tersebut varchar(n) .

Pemecahan masalah koneksi

Jika Anda tidak dapat membuat koneksi ke SQL Server menggunakan driver ODBC, gunakan informasi berikut untuk mengidentifikasi masalah.

Masalah koneksi yang paling umum adalah menginstal dua salinan manajer driver UnixODBC. Cari /usr untuk libodbc*.so*. Jika Anda melihat lebih dari satu versi file, Anda (mungkin) memiliki lebih dari satu manajer driver yang terinstal. Aplikasi Anda mungkin menggunakan versi yang salah.

Aktifkan log koneksi dengan mengedit file Anda /etc/odbcinst.ini agar berisi bagian berikut dengan item ini:

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

Jika Anda mendapatkan kegagalan koneksi lain dan tidak melihat file log, (mungkin) ada dua salinan manajer driver di komputer Anda. Jika tidak, output log harus mirip dengan:

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

Jika pengodean karakter ASCII bukan UTF-8, misalnya:

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

Ada lebih dari satu manajer driver yang terinstal dan aplikasi Anda menggunakan yang salah, atau manajer driver tidak dibangun dengan benar.

Beberapa pengguna macOS mengalami kesalahan berikut dengan driver versi 17.8 atau yang lebih lama:
(Kesalahan ini telah diatasi dalam driver versi 17.9+)

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

Kesalahan dapat terjadi ketika OpenSSL 3.0 diinstal. OpenSSL biasanya diinstal melalui Brew, dan berisi biner openssl, openssl@1.1, dan openssl@3.

Untuk mengatasi kesalahan ini, ubah symlink biner openssl menjadi 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

Untuk informasi selengkapnya tentang mengatasi kegagalan koneksi, lihat:

Langkah berikutnya

Untuk instruksi penginstalan driver ODBC, lihat artikel berikut ini:

Untuk informasi selengkapnya, lihat Panduan pemrograman dan catatan Rilis.