Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

freebcp:Data Unicode adalah ukuran byte ganjil untuk kolom. Harus genap ukuran byte

Pembaruan:Masalah ini tampaknya telah diperbaiki di FreeTDS v1.00.16, dirilis 04-11-2016.

Saya dapat mereproduksi masalah Anda menggunakan FreeTDS v1.00.15. Jelas terlihat seperti bug di freebcp yang menyebabkannya gagal ketika karakter terakhir dari bidang teks memiliki titik kode Unicode dalam bentuk U+20xx . (Terima kasih kepada @srutzky karena telah mengoreksi kesimpulan saya tentang penyebabnya.) Seperti yang Anda catat, ini berhasil ...

291054  Ţawī Rifā

... dan ini gagal ...

291054  Ţawī Rifā‘

... tetapi saya menemukan bahwa ini juga berfungsi:

291054  Ţawī Rifā‘x

Jadi, solusi yang buruk adalah menjalankan skrip terhadap file input Anda yang akan menambahkan karakter Unicode non-spasi orde rendah ke setiap bidang teks (mis., x yaitu U+0078 , seperti pada contoh terakhir di atas), gunakan freebcp untuk mengunggah data, lalu jalankan UPDATE pernyataan terhadap baris yang diimpor untuk menghapus karakter tambahan.

Secara pribadi, saya akan cenderung untuk beralih dari FreeTDS ke Microsoft SQL Server ODBC Driver untuk Linux, yang menyertakan bcp dan sqlcmd utilitas saat diinstal menggunakan petunjuk yang dijelaskan di sini:

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

Saya baru saja mengujinya di bawah Xubuntu 16.04, dan meskipun saya harus sedikit mengubah prosedur untuk menggunakan libssl.so.1.0.0 bukannya libssl.so.0.9.8 (dan hal yang sama untuk libcrypto ), setelah saya menginstalnya bcp utilitas dari Microsoft berhasil di mana freebcp gagal.

Jika SQL Server ODBC Driver untuk Linux tidak dapat bekerja pada Mac maka alternatif lain adalah menggunakan Microsoft JDBC Driver 6.0 untuk SQL Server dan sedikit kode Java, seperti ini:

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. Transaksi Terdistribusi pada Server Tertaut antara sql server dan mysql

  2. SQL Server Resumable Index:Apakah ini baik untuk Anda?

  3. hapus duplikat dari koma atau string operator pipa

  4. Rekursi maksimum 100 telah habis sebelum kesalahan penyelesaian pernyataan ditampilkan di SQL Query

  5. SQL Server setara dengan MySQL's EXPLAIN