Tôi tin rằng đây là sự cố mã hóa giữa shell và bcp / SQL Server. SQL Server mong đợi UTF-16 Little Endian, nhưng Linux không sử dụng điều đó. Mặc định cho máy ảo Linux của tôi là UTF-8 thông qua en_GB.UTF-8
.
<TL; DR> Sử dụng lệnh bcp "queryout" và chỉ định "SELECT * FROM ..."
thay vì sử dụng lệnh "out" và chỉ cần cung cấp tên bảng.
Điều gì sau đây là thử nghiệm của tôi ...
Tôi đã nhận được danh sách các ngôn ngữ / mã hóa có sẵn bằng cách sử dụng:
$ locale -a
trả lại:
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
Tôi đã thử một vài trong số các tùy chọn đó bằng cách cài đặt:
$ export LC_CTYPE=C.UTF-8
và sau đó thử lại bằng cách sử dụng:
$ export LC_ALL=C.UTF-8
Dường như không có gì để làm cho một sự khác biệt. Và mỗi lần tôi thử với các kết hợp khác nhau của dấu ngoặc vuông mà không có -q
và sau đó -q
, và sau đó không có dấu ngoặc vuông cả có và không có -q
.
Tôi thậm chí đã thử tiêm các byte tương đương với ký tự UTF-16 LE ä
thông qua $'\xe4\x00'
và thậm chí $'\xe4'$'\x00'
, nhưng không cải thiện.
TUY NHIÊN,
những gì đã làm công việc đã được thay đổi BCP lệnh từ out
để thay được queryout
, và sau đó thay đổi tên bảng là một phần của một SELECT
tuyên bố (tôi loại bỏ các -r ~
chuyển đổi duy nhất ở đây để làm cho dòng lệnh không cuộn theo chiều ngang, nhưng nó đã được trong thử nghiệm của tôi). Tôi đã tạo bảng trong [tempdb]
và chạy như sau:
bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
Không có vấn đề ở đó. Nhưng thật thú vị, tôi đã thay đổi dấu ä
thành không dấu a
:
bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
và nhận được lỗi sau:
SQLState = S1000, NativeError = 0
Error = [Microsoft] [Trình điều khiển ODBC 13 cho máy chủ SQL] Không thể giải quyết các đối chiếu mức cột
Đó là lỗi từ bcp và phải tham khảo dữ liệu meta tempdb
vì cột duy nhất trong bảng thử nghiệm của tôi sử dụng INT
kiểu dữ liệu.
Bây giờ, Collation cấp độ cá thể của tôi nhạy cảm với giọng nói, vì vậy tôi không thực sự mong đợi phần không có dấu a
hoạt động (mặc dù tôi đã mong đợi một lỗi "đối tượng không hợp lệ"). Vì vậy, để kiểm tra độ nhạy cảm của giọng nói, tôi đã tạo một Cơ sở dữ liệu mới với Collation of Latin1_General_100_CI_AI_KS_WS_CS
, tạo cùng bảng đó trong DB mới và thêm một vài hàng. Sau đó tôi đã chạy hai bài kiểm tra sau:
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
và cả hai đã làm việc!
Quay trở lại lệnh bcp ban đầu chỉ cần chỉ định tên bảng thay vì truy vấn, tôi đã có thể nhận ImportTest.dbo.[Table_Name]
và ImportTest.dbo.Table_Name
làm việc. Tuy nhiên, tôi vẫn không thể có được sự kết hợp nào ImportTest.dbo.[Täble_Name]
để làm việc; tất cả các biến thể có cùng một lỗi như trước đây.