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

max_allowed_pa​​cketを変更せずにmysqlDBに大きな値を挿入する方法はありますか?

    私は最近この問題に遭遇しました。私の場合、サーバーのmax_allowed_packet 1 MBで、変更することはできませんでした。そして、私は1MBのすぐ上にいくつかのデータを挿入していました。 2つのソリューション候補を見つけました。

    1)まず、JDBCを使用します。 MySQLConnector / J v3.1.9 以降 、設定できるパラメータがいくつかあります。JDBCURLのパラメータのセットは次のとおりです。

    これらを追加します:

    blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
    

    結果としてJDBCURLになります:

    jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
    

    次に、PreparedStatementを使用する必要があります 挿入を行い、InputStreamを使用します バイトコンテンツをパラメータとしてsetObjectに渡します 。 setObjectに注意してください バイト配列を使用しても、blob分割は有効になりません。パラメータの組み合わせ、最近のMySQLサーバー(5.0.45以降)、およびInputStream LONG DATAを使用してBLOBデータを送信します メカニズム、blobSendChunkSizeに従ってblobを分割します 。

    JDBCソリューションは機能し、テストしました。

    2)2番目の候補は、PHPの mysqliを使用することです。 ドライバーとmysqli_send_long_dataを使用します 。便宜上、PHPのマニュアルの例からコピー:

    <?php
    $stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
    $null = NULL;
    $stmt->bind_param("b", $null);
    $fp = fopen("messages.txt", "r");
    while (!feof($fp)) {
        $stmt->send_long_data(0, fread($fp, 8192));
    }
    fclose($fp);
    $stmt->execute();
    ?>
    


    1. SQL Serverへの接続の確立中に、ネットワーク関連またはインスタンス固有のエラーが発生したのはなぜですか?

    2. Oracleサブクエリは、2レベル上の外部ブロックからの変数を認識しません

    3. アルファ列の条件付きSQLORDERBY ASC / DESC

    4. mysqlでunionとorderby句を使用する