Atualização:Este problema aparentemente foi corrigido no FreeTDS v1.00.16, lançado em 2016-11-04.
Posso reproduzir seu problema usando o FreeTDS v1.00.15. Definitivamente, parece um bug no
freebcp
que faz com que ele falhe quando o último caractere de um campo de texto tem um ponto de código Unicode no formato U+20xx
. (Obrigado a @srutzky por corrigir minha conclusão quanto à causa.) Como você observou, isso funciona ... 291054 Ţawī Rifā
... e isso falha ...
291054 Ţawī Rifā‘
... mas descobri que isso também funciona:
291054 Ţawī Rifā‘x
Portanto, uma solução feia seria executar um script em seu arquivo de entrada que anexaria um caractere Unicode sem espaço de ordem inferior a cada campo de texto (por exemplo,
x
que é U+0078
, como no último exemplo acima), use freebcp
para carregar os dados e, em seguida, execute um UPDATE
instrução contra as linhas importadas para remover o caractere extra. Pessoalmente, eu estaria inclinado a mudar do FreeTDS para o SQL Server ODBC Driver for Linux da Microsoft, que inclui o
bcp
e sqlcmd
utilitários quando instalados usando as instruções descritas aqui:https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-and-BCP-for-Ubuntu-c88a28cc
Acabei de testar no Xubuntu 16.04 e, embora tenha que ajustar um pouco o procedimento para usar
libssl.so.1.0.0
em vez de libssl.so.0.9.8
(e o mesmo para libcrypto
), uma vez que eu instalei o bcp
utilitário da Microsoft teve sucesso onde freebcp
fracassado. Se o driver ODBC do SQL Server para Linux não funcionar em um Mac, outra alternativa seria usar o Microsoft JDBC Driver 6.0 para SQL Server e um pouco de código Java, como este:
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);
}