带有$符号的mysql表名

时间:2010-06-20 05:24:14

标签: java mysql spring jdbc jdbctemplate

我在Mysql 5 db中有表格,其名称前缀为美元符号'$' 即tablename $ 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", .., .. ));

2 个答案:

答案 0 :(得分: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中使用?占位符作为表名。这只是语言不支持的。您可以使用参数 only ,您通常可以使用文字值,如整数或单引号字符串。

答案 1 :(得分:0)

表格和列名称/标识符等数据库信息不应参数化。 MySQL对表和列名称/标识符使用反引号(`)。您的参数化查询可能会以:

的形式出现
 select symbol, open, high, low, close, vol, ev from "$AAPL"

我不知道任何用于参数化/转义标识符的标准API。我建议,如果可以的话,只是静静地把它放在那里。由于它们是相同的列,因此对表进行分区也可能是一种选择。最后,如果你仍然需要它是动态的,你必须自己逃避表名,我建议只从白名单中取出它。

您可能需要查看mysql documentation on how to escape identifiers