更新:この問題は、2016 年 11 月 4 日にリリースされた FreeTDS v1.00.16 で修正されたようです。
FreeTDS v1.00.15 を使用して問題を再現できます。 freebcp
のバグのようです。 テキスト フィールドの最後の文字が U+20xx
の形式の Unicode コード ポイントを持っている場合に失敗します。 . (原因に関する私の結論を修正してくれた @srutzky に感謝します。) ご指摘のとおり、これは機能します ...
291054 Ţawī Rifā
...そしてこれは失敗します...
291054 Ţawī Rifā‘
...しかし、これも機能することがわかりました:
291054 Ţawī Rifā‘x
したがって、醜い回避策は、入力ファイルに対してスクリプトを実行して、各テキスト フィールドに下位の非スペース Unicode 文字を追加することです (例:x
これは U+0078
です 、上記の最後の例のように)、freebcp
を使用します データをアップロードし、UPDATE
を実行します 余分な文字を取り除くために、インポートされた行に対するステートメント。
個人的には、FreeTDS から bcp
を含む Microsoft の SQL Server ODBC Driver for Linux に切り替えたいと思っています。 および sqlcmd
ここで説明する手順を使用してインストールした場合のユーティリティ:
https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-and-BCP-for-Ubuntu-c88a28cc
Xubuntu 16.04 でテストしましたが、 libssl.so.1.0.0
を使用するために手順を少し調整する必要がありました libssl.so.0.9.8
の代わりに (そして libcrypto
についても同じです )、bcp
をインストールしたら、 freebcp
で成功した Microsoft のユーティリティ 失敗しました。
Linux 用の SQL Server ODBC ドライバーが Mac で動作しない場合、別の代替手段として、SQL Server 用の Microsoft JDBC ドライバー 6.0 と、次のような Java コードを少し使用することができます。
connectionUrl = "jdbc:sqlserver://servername:49242"
+ ";databaseName=myDb"
+ ";integratedSecurity=false";
String myUserid = "sa", myPassword = "whatever";
String dataFileSpec = "C:/Users/Gord/Desktop/bad.txt";
try (
Connection conn = DriverManager.getConnection(connectionUrl, myUserid, myPassword);
SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord(dataFileSpec, "UTF-8", "\t", false);
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(conn)) {
fileRecord.addColumnMetadata(1, "col1", java.sql.Types.NVARCHAR, 50, 0);
fileRecord.addColumnMetadata(2, "col2", java.sql.Types.NVARCHAR, 50, 0);
bulkCopy.setDestinationTableName("dbo.freebcptest");
bulkCopy.writeToServer(fileRecord);
} catch (Exception e) {
e.printStackTrace(System.err);
}