sql >> Databáze >  >> RDS >> Sqlserver

freebcp:Data Unicode mají lichou velikost bajtů pro sloupec. Velikost by měla být sudá

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


  1. C# Mysql kódování UTF8

  2. výkonné řazení klíčů ve složeném indexu MySQL (WRT Rails Polymorphic Associations a STI)

  3. Jak dlouho trvá, než se přiměřeně zdokonalíte v Oracle vzhledem k SQL Serveru

  4. Kombinace podmínky ze dvou sloupců mysql