Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

freebcp:Dữ liệu Unicode có kích thước byte lẻ cho cột. Phải là kích thước byte chẵn

Cập nhật:Sự cố này dường như đã được khắc phục trong FreeTDS v1.00.16, phát hành ngày 11 tháng 11 năm 2016.

Tôi có thể tái tạo sự cố của bạn bằng FreeTDS v1.00.15. Nó chắc chắn giống như một lỗi trong freebcp khiến nó không thành công khi ký tự cuối cùng của trường văn bản có điểm mã Unicode có dạng U+20xx . (Cảm ơn @srutzky đã sửa chữa kết luận của tôi về nguyên nhân.) Như bạn đã lưu ý, điều này hoạt động ...

291054  Ţawī Rifā

... và điều này không thành công ...

291054  Ţawī Rifā‘

... nhưng tôi thấy rằng điều này cũng hoạt động:

291054  Ţawī Rifā‘x

Vì vậy, một giải pháp xấu sẽ là chạy một tập lệnh dựa trên tệp đầu vào của bạn, tập lệnh này sẽ nối một ký tự Unicode không có khoảng trắng bậc thấp vào mỗi trường văn bản (ví dụ:xU+0078 , như trong ví dụ cuối cùng ở trên), hãy sử dụng freebcp để tải lên dữ liệu, rồi chạy UPDATE câu lệnh đối với các hàng đã nhập để loại bỏ ký tự thừa.

Cá nhân tôi có xu hướng chuyển từ FreeTDS sang Trình điều khiển ODBC SQL Server của Microsoft cho Linux, bao gồm bcpsqlcmd các tiện ích khi được cài đặt bằng cách sử dụng các hướng dẫn được mô tả tại đây:

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

Tôi vừa thử nghiệm nó trong Xubuntu 16.04 và mặc dù tôi phải chỉnh sửa quy trình một chút để sử dụng libssl.so.1.0.0 thay vì libssl.so.0.9.8 (và tương tự đối với libcrypto ), sau khi tôi cài đặt xong bcp tiện ích từ Microsoft đã thành công trong đó freebcp không thành công.

Nếu Trình điều khiển ODBC SQL Server dành cho Linux không hoạt động trên máy Mac thì một giải pháp thay thế khác sẽ là sử dụng Trình điều khiển Microsoft JDBC 6.0 cho SQL Server và một chút mã Java, như sau:

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. LINQ to SQL:Sử dụng CPU quá nhiều:Điều gì xảy ra khi có nhiều người dùng

  2. trục sql động trong máy chủ sql

  3. Phương pháp tiếp cận tốt nhất cho tính năng tự động tăng trưởng là gì

  4. Cách tạo khóa ngoại tổng hợp trong SQL Server Management Studio 2012

  5. Cập nhật tài khoản thư cơ sở dữ liệu (SSMS)