1

我在 Mysql 5 db 中有表,其名称以美元符号“$”为前缀,即表名 $MYTABLE

我正在使用 Spring 3.0 JdbcTemplate 进行选择查询,但无法使其正常工作。

IE

    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 回答