Bu kabuk ve bcp / SQL Server arasında bir kodlama sorunu olduğuna inanıyorum . SQL Server UTF-16 Little Endian'ı bekliyor ancak Linux bunu kullanmıyor. Linux VM'm için varsayılan UTF-8'dir en_GB.UTF-8
.
<TL; DR> "queryout" bcp komutunu kullanın ve "SELECT * FROM ..."
"out" komutunu kullanmak ve yalnızca bir tablo adı vermek yerine belirtin .
İşte benim testim ...
Kullanarak kullanılabilir yerel / kodlama listesi var:
$ locale -a
iade:
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
Bu seçeneklerden birkaçını ayarlayarak denedim:
$ export LC_CTYPE=C.UTF-8
ve daha sonra şunu kullanarak tekrar deneyin:
$ export LC_ALL=C.UTF-8
Hiçbir şey fark yaratmadı. Ve her seferinde -q
ve sonra birlikte çeşitli köşeli parantez kombinasyonları ile denedim -q
ve sonra hem birlikte hem de olmadan köşeli parantez yok -q
.
Hatta UTF-16 LE karakterine denk olur bayt enjekte çalıştı ä
yoluyla $'\xe4\x00'
ve hatta $'\xe4'$'\x00'
, ancak hiçbir iyileştirmeler.
ANCAK,
Ne yaptığını iş değişiyordu BCP gelen komutu out
olmak yerine kadar queryout
ve sonra tablo adı bir parçası olmak değişen SELECT
açıklamada (kaldırdım -r ~
değil kaydırma yatay komut satırını yapmak sadece burada anahtar, ama benim test idi). Tabloyu oluşturdum [tempdb]
ve aşağıdakileri çalıştırdım:
bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
Orada sorun yok. Ama ilginç bir şekilde, aksanlıyı aksanlı ä
olmayan olarak değiştirdim a
:
bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
ve aşağıdaki hatayı aldı:
SQLState = S1000, NativeError = 0
Hata = [Microsoft] [SQL Server için ODBC Sürücüsü 13] Sütun düzeyi harmanlamaları çözülemedi
Bu, bcp'den gelen bir hatadır ve tempdb
test INT
tablomdaki tek sütun veri türünü kullandığından, meta verilerine başvurmalıdır .
Şimdi, benim örnek düzeyinde Harmanlama aksan duyarlıdır, bu yüzden gerçekten aksanlı a
("geçersiz nesne" hatası bekliyordum) çalışmasını beklemiyordum. Bu nedenle, aksan duyarsızlığını test etmek için, bir Harmanlama ile yeni bir Veritabanı Latin1_General_100_CI_AI_KS_WS_CS
oluşturdum, aynı veritabanını yeni DB'de oluşturdum ve birkaç satır ekledim. Daha sonra aşağıdaki iki testi yaptım:
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
ve ikisi de çalıştı!
Sadece sorgu yerine tablo adını belirterek ilk bcp komutuna geri dönüp , almak ImportTest.dbo.[Table_Name]
ve ImportTest.dbo.Table_Name
çalışmak mümkün . Ancak, yine de ImportTest.dbo.[Täble_Name]
çalışmak için herhangi bir kombinasyon elde edemedim; tüm varyasyonlar öncekilerle aynı hatalara sahipti.