Aktualizace:Tento problém byl zřejmě opraven ve FreeTDS v1.00.16, vydaném 2016-11-04.
Mohu váš problém reprodukovat pomocí FreeTDS v1.00.15. Rozhodně to vypadá na chybu v freebcp
což způsobí jeho selhání, když má poslední znak textového pole bod v kódu Unicode ve tvaru U+20xx
. (Děkuji @srutzky za opravu mého závěru ohledně příčiny.) Jak jste poznamenal, funguje to ...
291054 Ţawī Rifā
... a to selže ...
291054 Ţawī Rifā‘
... ale zjistil jsem, že to také funguje:
291054 Ţawī Rifā‘x
Ošklivým řešením by tedy bylo spustit skript proti vašemu vstupnímu souboru, který by ke každému textovému poli přidal znak Unicode bez mezery nízkého řádu (např. x
což je U+0078
, jako v posledním příkladu výše), použijte freebcp
nahrajte data a poté spusťte UPDATE
příkaz k importovaným řádkům, abyste odstranili nadbytečný znak.
Osobně bych se přikláněl k přechodu z FreeTDS na Microsoft SQL Server ODBC Driver pro Linux, který obsahuje bcp
a sqlcmd
nástroje při instalaci pomocí pokynů popsaných zde:
https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-and-BCP-for-Ubuntu-c88a28cc
Právě jsem to testoval pod Xubuntu 16.04, a přestože jsem musel postup trochu upravit, abych použil libssl.so.1.0.0
místo libssl.so.0.9.8
(a to samé pro libcrypto
), jakmile jsem nainstaloval bcp
utilita od Microsoftu uspěla tam, kde freebcp
selhalo.
Pokud SQL Server ODBC Driver pro Linux nebude fungovat na Macu, další alternativou by bylo použití Microsoft JDBC Driver 6.0 pro SQL Server a trochu kódu Java, jako je tento:
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);
}