Aktualizacja:Ten problem został najwyraźniej naprawiony w wersji FreeTDS v1.00.16, wydanej 04.11.2016.
Mogę odtworzyć Twój problem za pomocą FreeTDS v1.00.15. To zdecydowanie wygląda na błąd w freebcp
powoduje to niepowodzenie, gdy ostatni znak pola tekstowego ma punkt kodowy Unicode w postaci U+20xx
. (Podziękowania dla @srutzky za poprawienie mojego wniosku co do przyczyny.) Jak zauważyłeś, to działa...
291054 Ţawī Rifā
... i to się nie udaje ...
291054 Ţawī Rifā‘
... ale odkryłem, że to również działa:
291054 Ţawī Rifā‘x
Tak więc brzydkim obejściem byłoby uruchomienie skryptu na pliku wejściowym, który dodałby do każdego pola tekstowego znak Unicode niskiego rzędu bez spacji (np. x
czyli U+0078
, jak w poprzednim przykładzie powyżej), użyj freebcp
aby przesłać dane, a następnie uruchom UPDATE
oświadczenie względem importowanych wierszy, aby usunąć dodatkowy znak.
Osobiście byłbym skłonny przełączyć się z FreeTDS na sterownik Microsoft SQL Server ODBC dla systemu Linux, który zawiera bcp
i sqlcmd
narzędzia po zainstalowaniu zgodnie z instrukcjami opisanymi tutaj:
https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-i-BCP-dla-Ubuntu-c88a28cc
Właśnie przetestowałem go pod Xubuntu 16.04 i chociaż musiałem nieco poprawić procedurę, aby użyć libssl.so.1.0.0
zamiast libssl.so.0.9.8
(i to samo dla libcrypto
), po zainstalowaniu zainstalowałem bcp
narzędzie firmy Microsoft powiodło się, gdzie freebcp
nie powiodło się.
Jeśli sterownik ODBC SQL Server dla systemu Linux nie będzie działał na komputerze Mac, inną alternatywą byłoby użycie sterownika Microsoft JDBC Driver 6.0 dla SQL Server i odrobiny kodu Java, jak poniżej:
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);
}