Актуализация:Този проблем очевидно е коригиран във FreeTDS v1.00.16, издаден на 04.11.2016.
Мога да възпроизведа вашия проблем с помощта на FreeTDS v1.00.15. Определено изглежда като грешка в freebcp
което води до неуспех, когато последният символ на текстово поле има Unicode кодова точка във формата U+20xx
. (Благодаря на @srutzky за коригирането на заключението ми относно причината.) Както отбелязахте, това работи...
291054 Ţawī Rifā
... и това се проваля ...
291054 Ţawī Rifā‘
... но открих, че това също работи:
291054 Ţawī Rifā‘x
Така че грозно заобиколно решение би било да стартирате скрипт срещу вашия входен файл, който ще добави Unicode символ от нисък ред, който не е интервал, към всяко текстово поле (напр. x
което е U+0078
, както в последния пример по-горе), използвайте freebcp
за да качите данните и след това изпълнете UPDATE
израз срещу импортираните редове, за да премахнете допълнителния знак.
Лично аз бих бил склонен да премина от FreeTDS към SQL Server ODBC драйвера на Microsoft за Linux, който включва bcp
и 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
помощната програма от Microsoft успя, където freebcp
неуспешно.
Ако SQL Server ODBC драйверът за Linux няма да работи на Mac, тогава друга алтернатива би била да използвате Microsoft JDBC драйвер 6.0 за SQL Server и малко 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);
}