Saya percaya bahwa ini adalah masalah penyandian antara shell dan bcp / SQL Server. SQL Server mengharapkan UTF-16 Little Endian, tetapi Linux tidak menggunakannya. Default untuk VM Linux saya adalah UTF-8 via en_GB.UTF-8.
<TL; DR> Gunakan perintah bcp "queryout" dan tentukan "SELECT * FROM ..."alih-alih menggunakan perintah "out" dan cukup memberikan nama tabel.
Berikut ini adalah pengujian saya ...
Saya mendapat daftar lokal / penyandian menggunakan:
$ locale -a
dikembalikan:
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
Saya mencoba beberapa opsi dengan menetapkan:
$ export LC_CTYPE=C.UTF-8
dan kemudian coba lagi menggunakan:
$ export LC_ALL=C.UTF-8
Tampaknya tidak ada yang membuat perbedaan. Dan setiap kali saya mencoba dengan berbagai kombinasi kurung kotak tanpa -qdan kemudian dengan -q, dan kemudian tidak ada kurung kotak dengan dan tanpa -q.
Saya bahkan mencoba menyuntikkan byte yang akan menyamakan dengan karakter UTF-16 LE ävia $'\xe4\x00'dan genap $'\xe4'$'\x00', tetapi tidak ada perbaikan.
NAMUN,
apa yang lakukan pekerjaan yang mengubah bcp perintah dari outbukan untuk menjadi queryout, dan kemudian mengubah nama tabel untuk menjadi bagian dari SELECTpernyataan (saya dihapus -r ~beralih hanya di sini untuk membuat baris perintah tidak gulir horizontal, tapi itu dalam pengujian saya). Saya membuat tabel [tempdb]dan menjalankan yang berikut:
bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
Tidak ada masalah di sana. Tapi yang cukup menarik, saya mengubah aksen äke non-aksen a:
bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
dan menerima kesalahan berikut:
SQLState = S1000, NativeError = 0
Error = [Microsoft] [ODBC Driver 13 untuk SQL Server] Tidak dapat menyelesaikan pemeriksaan level kolom
Itu adalah kesalahan dari bcp dan harus merujuk ke meta-data tempdbkarena satu-satunya kolom dalam tabel pengujian saya menggunakan INTtipe data.
Sekarang, Collation tingkat instance saya peka-aksen, jadi saya tidak benar-benar mengharapkan non-aksen abekerja (meskipun saya memang mengharapkan kesalahan "objek tidak valid"). Jadi, untuk menguji ketidaksensitifan aksen, saya membuat Database baru dengan Collation of Latin1_General_100_CI_AI_KS_WS_CS, membuat tabel yang sama di DB baru, dan menambahkan beberapa baris. Saya kemudian menjalankan dua tes berikut:
bcp "SELECT * FROM ImportTest.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
bcp "SELECT * FROM ImportTest.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
dan keduanya bekerja!
Kembali ke perintah bcp awal hanya menentukan nama tabel, bukan kueri, saya bisa mendapatkan ImportTest.dbo.[Table_Name]dan ImportTest.dbo.Table_Namebekerja. Namun, saya masih tidak bisa mendapatkan kombinasi ImportTest.dbo.[Täble_Name]untuk bekerja; semua variasi mendapat kesalahan yang sama seperti sebelumnya.