2010-06-20 13 views
1

我在MySQL5分貝表用一個美元符號前綴名「$」 即表名$ MYTABLEmSQL的表名籤

我使用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", .., ..)); 
+0

你甚至在世界上如何管理?你最簡單的解決方案是從你的表名中取出標點符號...... – Charles 2010-06-20 05:33:08

回答

0

像表和列名稱/標識符這樣的數據庫信息並不意味着參數化。 MySQL使用反向符號(`)作爲表和列名稱/標識符。您的參數化查詢可能是:

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

我不知道任何標準的API用於參數化/轉義標識符。如果可以的話,我會推薦,只是爲了讓它靜靜地在那裏。由於它們是相同的列,所以分區表也可能是一個選項。最後,如果你仍然需要它是動態的,你必須自己逃避表名,我建議只從白名單中提取。您可能需要查看mysql documentation on how to escape identifiers

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中不使用?佔位符作爲表名。這只是語言不支持的。您只能使用參數,您可以在其中正常使用文字值,如整數或單引號字符串。