sql >> Database teknologi >  >> RDS >> Sqlserver

freebcp:Unicode-data er ulige bytestørrelser for kolonne. Bør være lige bytestørrelse

Opdatering:Dette problem er tilsyneladende blevet rettet i FreeTDS v1.00.16, udgivet 2016-11-04.

Jeg kan genskabe dit problem ved hjælp af FreeTDS v1.00.15. Det ligner bestemt en fejl i freebcp som får det til at mislykkes, når det sidste tegn i et tekstfelt har et Unicode-kodepunkt på formen U+20xx . (Tak til @srutzky for at korrigere min konklusion med hensyn til årsagen.) Som du bemærkede, virker dette ...

291054  Ţawī Rifā

... og dette mislykkes ...

291054  Ţawī Rifā‘

... men jeg fandt ud af, at dette også virker:

291054  Ţawī Rifā‘x

Så en grim løsning ville være at køre et script mod din inputfil, der ville tilføje et lavordens ikke-mellemrums Unicode-tegn til hvert tekstfelt (f.eks. x som er U+0078 , som i det sidste eksempel ovenfor), brug freebcp for at uploade dataene, og kør derefter en UPDATE sætning mod de importerede rækker for at fjerne det ekstra tegn.

Personligt ville jeg være tilbøjelig til at skifte fra FreeTDS til Microsofts SQL Server ODBC Driver til Linux, som inkluderer bcp og sqlcmd hjælpeprogrammer, når de er installeret ved hjælp af instruktionerne beskrevet her:

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

Jeg har lige testet det under Xubuntu 16.04, og selvom jeg var nødt til at justere proceduren lidt for at bruge libssl.so.1.0.0 i stedet for libssl.so.0.9.8 (og det samme for libcrypto ), når jeg fik det installeret bcp værktøj fra Microsoft lykkedes, hvor freebcp mislykkedes.

Hvis SQL Server ODBC Driver til Linux ikke vil fungere på en Mac, ville et andet alternativ være at bruge Microsoft JDBC Driver 6.0 til SQL Server og en lille smule Java-kode, som denne:

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. Hvordan forespørger jeg mellem to tidsintervaller ved hjælp af MySQL?

  2. FEJL! MySQL-manager eller server-PID-fil kunne ikke findes! QNAP

  3. hvordan man genindekserer mysql-tabel

  4. JOIN med GROUP BY i en normaliseret DB om ressourcer, emner og kapitler