sql >> Databasteknik >  >> RDS >> Sqlserver

freebcp:Unicode-data är udda bytestorlek för kolumn. Bör vara jämn bytestorlek

Uppdatering:Det här problemet har tydligen åtgärdats i FreeTDS v1.00.16, släppt 2016-11-04.

Jag kan återskapa ditt problem med FreeTDS v1.00.15. Det ser definitivt ut som en bugg i freebcp som gör att det misslyckas när det sista tecknet i ett textfält har en Unicode-kodpunkt av formen U+20xx . (Tack till @srutzky för att du rättade min slutsats angående orsaken.) Som du noterade fungerar det här ...

291054  Ţawī Rifā

... och detta misslyckas ...

291054  Ţawī Rifā‘

... men jag upptäckte att detta också fungerar:

291054  Ţawī Rifā‘x

Så en ful lösning skulle vara att köra ett skript mot din indatafil som skulle lägga till ett Unicode-tecken av låg ordning utan mellanslag i varje textfält (t.ex. x vilket är U+0078 , som i det sista exemplet ovan), använd freebcp för att ladda upp data och kör sedan en UPDATE uttalande mot de importerade raderna för att ta bort det extra tecknet.

Personligen skulle jag vara benägen att byta från FreeTDS till Microsofts SQL Server ODBC-drivrutin för Linux, som inkluderar bcp och sqlcmd verktyg när de installeras enligt instruktionerna som beskrivs här:

https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-and-BCP-for-Ubuntu-c88a28cc

Jag testade det precis under Xubuntu 16.04, och även om jag var tvungen att justera proceduren lite för att använda libssl.so.1.0.0 istället för libssl.so.0.9.8 (och samma sak för libcrypto ), när jag fick det installerade bcp verktyget från Microsoft lyckades där freebcp misslyckades.

Om SQL Server ODBC-drivrutinen för Linux inte fungerar på en Mac skulle ett annat alternativ vara att använda Microsoft JDBC Driver 6.0 för SQL Server och lite Java-kod, så här:

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);
}


  1. Datatyp matchar inte (kod 20) vid infogning

  2. MySQL fel 1064 syntax men allt verkar bra

  3. Meddelande om ändring av Oracle Database

  4. Konvertera effektivt rader till kolumner i sql-servern