これはシェルとbcp / SQL Server 間のエンコーディングの問題だと思います。SQL ServerはUTF-16リトルエンディアンを想定していますが、Linuxはそれを使用していません。Linux VMのデフォルトはを介したUTF-8 en_GB.UTF-8
です。
<TL; DR>「out」コマンドを使用する代わりに「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
。
私は、ä
via $'\xe4\x00'
およびeven のUTF-16 LE文字に相当するバイトを注入することも試みました$'\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 Driver 13 for SQL Server]列レベルの照合順序を解決できません
これはbcpからのエラーtempdb
であり、テストテーブルの唯一の列がINT
データ型を使用しているため、メタデータを参照している必要があります。
現在、インスタンスレベルの照合順序はアクセントを区別するため、非アクセント記号が機能することを実際には期待していませんでしたa
(ただし、「無効なオブジェクト」エラーを予期していました)。したがって、アクセント非依存性をテストするために、Collation of Latin1_General_100_CI_AI_KS_WS_CS
を使用して新しいデータベースを作成し、新しいDBに同じテーブルを作成して、いくつかの行を追加しました。次に、次の2つのテストを実行しました。
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]
。すべてのバリエーションで以前と同じエラーが発生しました。