Я вважаю, що це проблема кодування між оболонкою та bcp / SQL Server. SQL Server очікує, що UTF-16 Little Endian, але Linux це не використовує. Типовим моїм Linux VM є UTF-8 via en_GB.UTF-8
.
<TL; DR> Використовуйте «queryout» BCP команду і вказати "SELECT * FROM ..."
замість того , щоб використовувати команду «з» і просто поставляти ім'я таблиці.
Далі йде моє тестування ...
Я отримав список доступних локалів / кодувань за допомогою:
$ locale -a
повернуто:
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
Я спробував кілька таких варіантів, встановивши:
$ export LC_CTYPE=C.UTF-8
а потім повторити спробу:
$ export LC_ALL=C.UTF-8
Начебто нічого не мало значення. І кожного разу я намагався з різними комбінаціями квадратних дужок без, -q
а потім з -q
, а потім жодних квадратних дужок як із, так і без -q
.
Я навіть намагався вводити байти, які б прирівнювались до символу UTF-16 LE ä
через via $'\xe4\x00'
і even $'\xe4'$'\x00'
, але жодних поліпшень не було.
ЗАРАЗ
то , що зробив роботу змінював BCP команду , out
щоб замість цього queryout
, а потім змінити ім'я таблиці , щоб бути частиною SELECT
заяви (я витягував -r ~
перемикач тільки тут , щоб зробити командну рядок не прокрутки по горизонталі, але це було в моєму тестуванні). Я створив таблицю в [tempdb]
та запустив наступне:
bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
Ніяких проблем там немає. Але що цікаво, я змінив наголоси ä
на ненаголошені a
:
bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
і отримали таку помилку:
SQLState = S1000, NativeError = 0
Помилка = [Microsoft] [Драйвер ODBC 13 для SQL Server] Неможливо вирішити порівняння рівня стовпців
Це помилка від bcp, і вона повинна посилатися на метадані, tempdb
оскільки єдиний стовпець у моїй тестовій таблиці використовує INT
тип даних.
Тепер моє зіставлення рівня екземпляра чутливе до акцентів, тому я насправді a
не сподівався на те, що не буде акцентовано діяти (хоча я очікував помилки "недійсного об'єкта"). Отже, щоб перевірити нечутливість до акцентів, я створив нову Базу даних із зіставленням Latin1_General_100_CI_AI_KS_WS_CS
, створив ту саму таблицю в новій БД та додав кілька рядків. Потім я провів наступні два тести:
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
і обидва працювали!
Повернувшись до початкової команди bcp просто вказавши ім’я таблиці замість запиту, я зміг отримати ImportTest.dbo.[Table_Name]
та ImportTest.dbo.Table_Name
працювати. Однак мені ще не вдалося отримати будь-яку комбінацію ImportTest.dbo.[Täble_Name]
роботи; всі варіанти отримали ті ж помилки, що і раніше.