sql >> データベース >  >> RDS >> Sqlserver

freebcp:Unicode データの列のバイト サイズが奇数です。偶数バイトサイズにする必要があります

    更新:この問題は、2016 年 11 月 4 日にリリースされた FreeTDS v1.00.16 で修正されたようです。

    FreeTDS v1.00.15 を使用して問題を再現できます。 freebcp のバグのようです。 テキスト フィールドの最後の文字が U+20xx の形式の Unicode コード ポイントを持っている場合に失敗します。 . (原因に関する私の結論を修正してくれた @srutzky に感謝します。) ご指摘のとおり、これは機能します ...

    291054  Ţawī Rifā
    

    ...そしてこれは失敗します...

    291054  Ţawī Rifā‘
    

    ...しかし、これも機能することがわかりました:

    291054  Ţawī Rifā‘x
    

    したがって、醜い回避策は、入力ファイルに対してスクリプトを実行して、各テキスト フィールドに下位の非スペース Unicode 文字を追加することです (例:x これは U+0078 です 、上記の最後の例のように)、freebcp を使用します データをアップロードし、UPDATE を実行します 余分な文字を取り除くために、インポートされた行に対するステートメント。

    個人的には、FreeTDS から bcp を含む Microsoft の SQL Server ODBC Driver for Linux に切り替えたいと思っています。 および 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 をインストールしたら、 freebcp で成功した Microsoft のユーティリティ 失敗しました。

    Linux 用の SQL Server ODBC ドライバーが Mac で動作しない場合、別の代替手段として、SQL Server 用の Microsoft JDBC ドライバー 6.0 と、次のような 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. MySQLダイナミックピボット

    2. 外部キー制約が正しく形成されていないため、テーブルの作成が失敗する

    3. csvでのファイルポインタの操作

    4. SQL Server 2008 のインストール