Имя таблицы msql со знаком $ - PullRequest
1 голос
/ 20 июня 2010

У меня есть таблицы в Mysql 5 дБ с именами, начинающимися с знака доллара '$', т.е. имя таблицы $ MYTABLE

Я использую Spring 3.0 JdbcTemplate для выполнения моего запроса select, но не могу заставить его работать

т.е.

    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 ]

2 голосов
/ 20 июня 2010

SQL поддерживает идентификаторы с разделителями , поэтому вы можете использовать знаки препинания, пробелы, специальные символы, международные символы или ключевые слова SQL в качестве имен таблиц или имен столбцов.

См. Мой предыдущий ответ на Используют ли разные базы данных разные кавычки имен?

В 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.Это просто не поддерживается языком.Вы можете использовать параметр только , где обычно можно использовать буквальное значение, например целое число или строку в одинарных кавычках.

0 голосов
/ 20 июня 2010

Информация базы данных, такая как имена / идентификаторы таблиц и столбцов, не предназначена для параметризации.MySQL использует backtick (`) для имен / идентификаторов таблиц и столбцов.Ваш параметризованный запрос, вероятно, выглядит так:

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

Я не знаю ни одного стандартного API для параметризации / экранирования идентификаторов, подобных этому.Я бы порекомендовал, если вы можете, просто статически.Поскольку они представляют собой одни и те же столбцы, разделение таблицы также может быть вариантом.Наконец, если вам все еще нужно, чтобы оно было динамичным, вам придется избегать имени таблицы самостоятельно, я рекомендую извлекать его только из белого списка.

Возможно, вы захотите взглянуть на MySQL документация о том, как экранировать идентификаторы .

...