Uważam, że jest to problem z kodowaniem między powłoką a programem bcp / SQL Server. SQL Server oczekuje UTF-16 Little Endian, ale Linux tego nie używa. Domyślnie dla mojej maszyny wirtualnej z systemem Linux jest UTF-8 przez en_GB.UTF-8
.
<TL; DR> Użyj polecenia bcp „queryout” i podaj "SELECT * FROM ..."
zamiast polecenia „out” i po prostu podaj nazwę tabeli.
Poniżej znajdują się moje testy ...
Mam listę dostępnych ustawień regionalnych / kodowania przy użyciu:
$ locale -a
zwrócony:
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
Wypróbowałem kilka z tych opcji, ustawiając:
$ export LC_CTYPE=C.UTF-8
a następnie spróbuj ponownie za pomocą:
$ export LC_ALL=C.UTF-8
Wydawało się, że nic nie robi różnicy. I za każdym razem próbowałem z różnymi kombinacjami nawiasów kwadratowych bez, -q
a następnie z -q
, a następnie bez nawiasów kwadratowych zarówno z jak i bez -q
.
Próbowałem nawet wstrzykiwać bajty, które byłyby równe znakowi UTF-16 LE z ä
via, $'\xe4\x00'
a nawet $'\xe4'$'\x00'
, ale bez ulepszeń.
JEDNAK,
co zrobił praca została zmieniając bcp polecenie out
, aby zamiast być queryout
, a następnie zmienia nazwę tabeli, aby być częścią SELECT
rachunku (usunąłem -r ~
przełącznik tylko po to, aby z wiersza poleceń nie przewijania w poziomie, ale to było w moim testowania). Utworzyłem tabelę [tempdb]
i uruchomiłem następujące:
bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
Nie ma tam problemów. Ale co ciekawe, zmieniłem akcent ä
na nieakcentowany a
:
bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
i otrzymał następujący błąd:
SQLState = S1000, NativeError = 0
Error = [Microsoft] [ODBC Driver 13 for SQL Server] Nie można rozwiązać zestawień na poziomie kolumny
Jest to błąd bcp i musi odnosić się do metadanych, tempdb
ponieważ jedyna kolumna w mojej tabeli testowej używa INT
typu danych.
Teraz moje sortowanie na poziomie instancji jest wrażliwe na akcent, więc tak naprawdę nie spodziewałem się, że nieakcentowany a
zadziała (chociaż spodziewałem się błędu „nieprawidłowego obiektu”). Aby przetestować niewrażliwość na akcent, utworzyłem nową bazę danych z sortowaniem Latin1_General_100_CI_AI_KS_WS_CS
, utwórz tę samą tabelę w nowej bazie danych i dodałem kilka wierszy. Następnie przeprowadziłem następujące dwa testy:
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
i oba działały!
Wracając do początkowej komendy bcp, polegającej na określeniu nazwy tabeli zamiast zapytania, mogłem dostać się ImportTest.dbo.[Table_Name]
i ImportTest.dbo.Table_Name
pracować. Jednak nadal nie byłem w stanie uzyskać żadnej kombinacji ImportTest.dbo.[Täble_Name]
pracy; wszystkie odmiany miały takie same błędy jak poprzednio.