Я считаю, что это проблема кодирования между оболочкой и 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'
и даже $'\xe4'$'\x00'
, но без улучшений.
ОДНАКО,
то, что сработало, изменило команду bcp с out
вместо вместо be 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
тип данных.
Теперь мой Collation на уровне экземпляра чувствителен к акценту, поэтому я не ожидал, что не-акцентированный 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]
для работы; все варианты получили те же ошибки, что и раньше.