Masalah umum untuk driver ODBC di Linux dan macOS
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, lihatmusl libc
- perbedaanglibc
fungsi 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)
atauchar(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-langkah untuk memecahkan masalah konektivitas SQL
- Masalah Konektivitas SQL Server 2005 - Bagian I
- Pemecahan masalah konektivitas di SQL Server 2008 dengan Buffer Cincin Konektivitas
- Pemecah Masalah Autentikasi SQL Server
Langkah berikutnya
Untuk instruksi penginstalan driver ODBC, lihat artikel berikut ini:
- Menginstal Microsoft ODBC Driver untuk SQL Server di Linux
- Menginstal Driver Microsoft ODBC untuk SQL Server di macOS
Untuk informasi selengkapnya, lihat Panduan pemrograman dan catatan Rilis.