Pembaruan:Masalah ini tampaknya telah diperbaiki di FreeTDS v1.00.16, dirilis 04-11-2016.
Saya dapat mereproduksi masalah Anda menggunakan FreeTDS v1.00.15. Jelas terlihat seperti bug di freebcp
yang menyebabkannya gagal ketika karakter terakhir dari bidang teks memiliki titik kode Unicode dalam bentuk U+20xx
. (Terima kasih kepada @srutzky karena telah mengoreksi kesimpulan saya tentang penyebabnya.) Seperti yang Anda catat, ini berhasil ...
291054 Ţawī Rifā
... dan ini gagal ...
291054 Ţawī Rifā‘
... tetapi saya menemukan bahwa ini juga berfungsi:
291054 Ţawī Rifā‘x
Jadi, solusi yang buruk adalah menjalankan skrip terhadap file input Anda yang akan menambahkan karakter Unicode non-spasi orde rendah ke setiap bidang teks (mis., x
yaitu U+0078
, seperti pada contoh terakhir di atas), gunakan freebcp
untuk mengunggah data, lalu jalankan UPDATE
pernyataan terhadap baris yang diimpor untuk menghapus karakter tambahan.
Secara pribadi, saya akan cenderung untuk beralih dari FreeTDS ke Microsoft SQL Server ODBC Driver untuk Linux, yang menyertakan bcp
dan sqlcmd
utilitas saat diinstal menggunakan petunjuk yang dijelaskan di sini:
https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-and-BCP-for-Ubuntu-c88a28cc
Saya baru saja mengujinya di bawah Xubuntu 16.04, dan meskipun saya harus sedikit mengubah prosedur untuk menggunakan libssl.so.1.0.0
bukannya libssl.so.0.9.8
(dan hal yang sama untuk libcrypto
), setelah saya menginstalnya bcp
utilitas dari Microsoft berhasil di mana freebcp
gagal.
Jika SQL Server ODBC Driver untuk Linux tidak dapat bekerja pada Mac maka alternatif lain adalah menggunakan Microsoft JDBC Driver 6.0 untuk SQL Server dan sedikit kode Java, seperti ini:
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);
}