1

私はJavaのStringBuilderと混同しました。私のコードはここにあります:

StringBuilder cmdB = new StringBuilder(
            "INSERT IGNORE INTO Query ( context, category, generality, freshness, TokenCount, type) VALUES ");
    for (int i = 0; i < querydata.size(); i++) {

        if (i == 0)
            cmdB.append("('");
        else
            cmdB.append(",('");
        cmdB.append(querydata.get(i).getContext() + "',"
                + querydata.get(i).getCategory() + ","
                + querydata.get(i).getGenerality() + ","
                + querydata.get(i).getFreshness() + ","
                + querydata.get(i).getTokenCount() + ","
                + querydata.get(i).getType());
        cmdB.append(")");
    }
    cmdB.append(";");

データベースとしてMysqlがあり、1000行を挿入する文字列を作成したいと思います。querydata.get(i).getContext()は文字列を返し、英語(左から右)とペルシア語(右から左への言語)を含みます。

querydata.get(i).getContext()が「دانلودکرکبازیghost recon」を返すと、Stringbuilderに追加されます。私の結果は以下のとおりです。

INSERT IGNORE INTO Query(context、category、generality、freshness、TokenCount、type)VALUES('پخشزندهفوتبال'、2,1.0,0.0,2,1)、('عکسهایجشنوارهفیلمفجر'、2,1.0,0.0、 2,1)、('نتایجلیگبرتر'、2,1.0,0.0,2,1)、('دانلودکرکبازیghostrecon'、2,1.0,0.0,2,1)。

4

2 に答える 2

3

論理的な順序に関しては、文字列の内容に実際には何も問題はありません。私が見る限り、混乱する可能性があるのは、印刷時に双方向テキストがレンダリングされる方法です。文字列の上にマウスをドラッグすると、選択範囲がジャンプして、どのテキストの実行がどの主要な方向性でレンダリングされているかを確認できます。

値のセットを改行で区切ると、

INSERT IGNORE INTO Query(context、category、generality、freshness、TokenCount、type)VALUES
('پخشزندهفوتبال'、2,1.0,0.0,2,1)、
('عکسهایجشنوارهفیلمفجر'、2,1.0,0.0、 2,1)、
('نتایجلیگبرتر'、2,1.0,0.0,2,1)、
('دانلودکرکبازیghostrecon'、2,1.0,0.0,2,1)。

ブラウザに何が表示されるかはわかりませんが、私の場合は、そのINSERT INTO ... VALUES行をLTRとして扱い、その後の行は、ghost recon主にRTLを含む行まで含まれていません。U+200Eペルシア語のスクリプト部分の周りにUnicodeの左から右へのマーカー()が挿入された同じ文字列を次に示します。これにより、周囲の引用符と角かっこがLTRとして扱われるようになります。

INSERT IGNORE INTO Query(context、category、generality、freshness、TokenCount、type)VALUES
('پخشزندهفوتبال'、2,1.0,0.0,2,1)、
('عکسهایجشنوارهفیلمفجر'、2、 1.0,0.0,2,1)、
('نتایجلیگبرتر'、2,1.0,0.0,2,1)、
('دانلودکرکبازیghostrecon'、2,1.0,0.0,2,1) 。

言い換えれば、心配しないでください。データベースには正しいものが含まれています。

しかし、コンテキスト文字列のいずれかにアポストロフィが含まれている場合にSQLインジェクション攻撃(またはあいまいなエラー)から保護するために、 SQLをビルドする代わりに使用することを検討する必要があるというこの回答にも同意します(これはあなたが思っているよりも頻繁に発生します) 。PreparedStatementStringBuilder

于 2012-12-31T12:32:00.130 に答える
1

質問の内容が正確にはわかりませんが、バッチ挿入ツールを使用してこのような大きな挿入を行うことを検討する必要があります。メモリ、速度、セキュリティの面で優れています。SpringSourceのJdbcTemplateとそのbatchUpdateメソッドを確認してください。以下はグーグル検索から取られた簡単な例です...

public void insertBatch(final List<Customer> customers){
 
  String sql = "INSERT INTO CUSTOMER " +
    "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
 
  getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
 
    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        Customer customer = customers.get(i);
        ps.setLong(1, customer.getCustId());
        ps.setString(2, customer.getName());
        ps.setInt(3, customer.getAge() );
    }
 
    @Override
    public int getBatchSize() {
        return customers.size();
    }
  });
}
于 2012-12-31T12:03:59.967 に答える