代码之家  ›  专栏  ›  技术社区  ›  Lydon Ch

带$符号的MSQL表名

  •  1
  • Lydon Ch  · 技术社区  · 15 年前

    我有MySQL5DB中的表,表名前面有一个美元符号“$” IE表格名称$MyTable

    我正在使用Spring3.0JDBCTemplate执行选择查询,但无法使其正常工作。

    工业工程

        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,可能是因为$sign。 如果我只是做一个没有参数的普通查询,即。

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

    然后一切正常。

    如何使用JDBCtemplate转义$sign?

    --编辑,我最终做了什么--

    我不将表名“$aapl”传递给JDBCTemplate,而是手动创建SQL字符串,即。

     jdbcTemplate.query( getStockSelect("$AAPL", .., .. ));
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   Reece45    15 年前

    表和列名称/标识符等数据库信息不应参数化。mysql使用backtick(`)作为表名和列名/标识符。参数化查询可能以如下方式进入:

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

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

    You may want to take a look at the mysql documentation on how to escape identifiers .

        2
  •  2
  •   Community CDub    8 年前

    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_模式设置为ansi模式并使用双引号:

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

    你不能使用 ? SQL中表名的占位符。这只是语言不支持。可以使用参数 只有 在这里,您通常可以使用一个文本值,比如整数或单引号字符串。