我在 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", .., .. ));
最佳答案
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 中为表名使用 ?
占位符。这只是语言不支持的。您可以仅在通常可以使用文字值(如整数或单引号字符串)的地方使用参数。
关于java - 带$符号的sql表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078312/