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 -q
dan 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 out
bukan untuk menjadi queryout
, dan kemudian mengubah nama tabel untuk menjadi bagian dari SELECT
pernyataan (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 tempdb
karena satu-satunya kolom dalam tabel pengujian saya menggunakan INT
tipe data.
Sekarang, Collation tingkat instance saya peka-aksen, jadi saya tidak benar-benar mengharapkan non-aksen a
bekerja (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_Name
bekerja. Namun, saya masih tidak bisa mendapatkan kombinasi ImportTest.dbo.[Täble_Name]
untuk bekerja; semua variasi mendapat kesalahan yang sama seperti sebelumnya.