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ụ:x
là U+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 bcp
và sqlcmd
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);
}