1

Mysql 5 db にドル記号「$」を前に付けた名前のテーブルがあります。つまり、テーブル名 $MYTABLE

Spring 3.0 JdbcTemplate を使用して選択クエリを実行していますが、動作させることができませんでした。

すなわち

    String tablename = "$AAPL";

    private static final String STOCK_SELECT = 
    "select symbol, open, high, low, close, vol, ev from ?";

    jdbcTemplate.query(STOCK_SELECT, 
                       new Object[] { tablename },
                       new RowMapper() { .... } );

これは、おそらく $ 記号が原因で、常に InvalidSqlException をスローします。パラメータなしで通常のクエリを実行すると、つまり.

    private static final String STOCK_SELECT = 
    "select symbol, open, high, low, close, vol, ev from $AAPL";

その後、すべてが機能します。

jdbcTemplate を使用して $ 記号をエスケープするにはどうすればよいですか?

--編集、私がやったこと-

テーブル名「$AAPL」を jdbcTemplate に渡す代わりに、SQL 文字列を手動で作成するだけです。

 jdbcTemplate.query( getStockSelect("$AAPL", .., .. ));
4

2 に答える 2

2

SQL は区切り識別子をサポートしているため、句読点、空白、特殊記号、国際文字、または SQL キーワードをテーブル名または列名として使用できます。

Do different databases use different name quote?に対する私の過去の回答を参照してください。

MySQL では、逆引用符を使用します。

private static final String STOCK_SELECT = 
"select symbol, open, high, low, close, vol, ev from `$AAPL`";

または、SQL_MODE を ANSI モードに設定し、二重引用符を使用します。

private static final String STOCK_SELECT = 
"select symbol, open, high, low, close, vol, ev from \"$AAPL\"";

?SQL では、テーブル名にプレースホルダーを使用できません。それは言語によってサポートされていません。整数や単一引用符で囲まれた文字列など、通常はリテラル値を使用できる場合にのみ、パラメーターを使用できます。

于 2010-06-20T05:43:35.197 に答える
0

テーブルや列の名前/識別子などのデータベース情報は、パラメータ化することを意図したものではありません。MySQLは、テーブルと列の名前/識別子にバックティック( `)を使用します。パラメータ化されたクエリは、おそらく次のようになります。

 select symbol, open, high, low, close, vol, ev from "$AAPL"

私はそのような識別子をパラメータ化/エスケープするための標準APIを知りません。可能であれば、静的にそこに置くことをお勧めします。それらは同じ列であるため、テーブルを分割することもオプションになる可能性があります。最後に、それでも動的である必要がある場合は、テーブル名を自分でエスケープする必要があります。ホワイトリストからのみプルすることをお勧めします。

識別子をエスケープする方法については、mysqlのドキュメントを参照してください。

于 2010-06-20T05:47:00.977 に答える