Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

freebcp:Unicode данните са с нечетен размер на байта за колона. Трябва да има равен размер на байта

Актуализация:Този проблем очевидно е коригиран във FreeTDS v1.00.16, издаден на 04.11.2016.

Мога да възпроизведа вашия проблем с помощта на FreeTDS v1.00.15. Определено изглежда като грешка в freebcp което води до неуспех, когато последният символ на текстово поле има Unicode кодова точка във формата U+20xx . (Благодаря на @srutzky за коригирането на заключението ми относно причината.) Както отбелязахте, това работи...

291054  Ţawī Rifā

... и това се проваля ...

291054  Ţawī Rifā‘

... но открих, че това също работи:

291054  Ţawī Rifā‘x

Така че грозно заобиколно решение би било да стартирате скрипт срещу вашия входен файл, който ще добави Unicode символ от нисък ред, който не е интервал, към всяко текстово поле (напр. x което е U+0078 , както в последния пример по-горе), използвайте freebcp за да качите данните и след това изпълнете UPDATE израз срещу импортираните редове, за да премахнете допълнителния знак.

Лично аз бих бил склонен да премина от FreeTDS към SQL Server ODBC драйвера на Microsoft за Linux, който включва bcp и sqlcmd помощни програми, когато се инсталира с помощта на инструкциите, описани тук:

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

Току-що го тествах под Xubuntu 16.04 и въпреки че трябваше да променя малко процедурата, за да използвам libssl.so.1.0.0 вместо libssl.so.0.9.8 (и същото за libcrypto ), след като го накарах, инсталирах bcp помощната програма от Microsoft успя, където freebcp неуспешно.

Ако SQL Server ODBC драйверът за Linux няма да работи на Mac, тогава друга алтернатива би била да използвате Microsoft JDBC драйвер 6.0 за SQL Server и малко Java код, като този:

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. Необходим е SQL:сумиране на стойности по месеци

  2. Цикъл на SQL Server - как да преглеждам набор от записи

  3. Как да намеря всички тригери, свързани с таблица с SQL Server?

  4. Кеширане на временни обекти на SQL Server

  5. Лоша производителност на плана за изпълнение на съхранената процедура на SQL - подслушване на параметри