Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

freebcp:dane Unicode mają nieparzysty rozmiar w bajtach dla kolumny. Powinien mieć równy rozmiar bajtów

Aktualizacja:Ten problem został najwyraźniej naprawiony w wersji FreeTDS v1.00.16, wydanej 04.11.2016.

Mogę odtworzyć Twój problem za pomocą FreeTDS v1.00.15. To zdecydowanie wygląda na błąd w freebcp powoduje to niepowodzenie, gdy ostatni znak pola tekstowego ma punkt kodowy Unicode w postaci U+20xx . (Podziękowania dla @srutzky za poprawienie mojego wniosku co do przyczyny.) Jak zauważyłeś, to działa...

291054  Ţawī Rifā

... i to się nie udaje ...

291054  Ţawī Rifā‘

... ale odkryłem, że to również działa:

291054  Ţawī Rifā‘x

Tak więc brzydkim obejściem byłoby uruchomienie skryptu na pliku wejściowym, który dodałby do każdego pola tekstowego znak Unicode niskiego rzędu bez spacji (np. x czyli U+0078 , jak w poprzednim przykładzie powyżej), użyj freebcp aby przesłać dane, a następnie uruchom UPDATE oświadczenie względem importowanych wierszy, aby usunąć dodatkowy znak.

Osobiście byłbym skłonny przełączyć się z FreeTDS na sterownik Microsoft SQL Server ODBC dla systemu Linux, który zawiera bcp i sqlcmd narzędzia po zainstalowaniu zgodnie z instrukcjami opisanymi tutaj:

https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-i-BCP-dla-Ubuntu-c88a28cc

Właśnie przetestowałem go pod Xubuntu 16.04 i chociaż musiałem nieco poprawić procedurę, aby użyć libssl.so.1.0.0 zamiast libssl.so.0.9.8 (i to samo dla libcrypto ), po zainstalowaniu zainstalowałem bcp narzędzie firmy Microsoft powiodło się, gdzie freebcp nie powiodło się.

Jeśli sterownik ODBC SQL Server dla systemu Linux nie będzie działał na komputerze Mac, inną alternatywą byłoby użycie sterownika Microsoft JDBC Driver 6.0 dla SQL Server i odrobiny kodu Java, jak poniżej:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć ograniczenie klucza obcego w bazie danych SQL Server — samouczek SQL Server / TSQL część 75

  2. SQL:widok dynamiczny z nazwami kolumn opartymi na wartościach kolumn w tabeli źródłowej

  3. Zaktualizuj krok zadania dla zadania agenta programu SQL Server (T-SQL)

  4. Dostawca nazwanych potoków Błąd dostawcy 40 nie może otworzyć połączenia z błędem 2 programu SQL Server

  5. Wyniki oddzielone przecinkami w SQL