#mysql
Вопрос:
на этой неделе я столкнулся со странным случаем при использовании mysql.
Версия сервера mysql-mysql 5.7.22,
версия драйвера jdbc-8.0.23.
Как я знаю, в имени таблицы не может быть заполнителей.
Но следующий код может быть выполнен нормально.
PreparedStatement ps = conn.prepareStatement("select count(1) from g_?");
ps.setInt(1, 1);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt(1));
}
Но если вы используете ps.setString(1, «1»);
произойдет ошибка сервера mysql.
Таблица создается с помощью
create table g_1(t int not null)
.
Я не смог найти никакой ссылки в документе mysql.
Очень признателен за любое предложение.
Комментарии:
1. Я не думаю, что это имеет какое-либо отношение к mysql, в данном случае замена, похоже, выполняется на стороне клиента.
2. @Тень, похоже, ты прав. Подготовка и привязка выполняются на стороне клиента, и, похоже, в oracle поведение preparedstatment отличается. Кстати, я отлаживаю исходный код java mysql connector всего на некоторое время, требуется дополнительное подтверждение.
Ответ №1:
Вывод:
Подготовка и привязка инструкции sql выполняются клиентом mysql,
в отличие от многих СУБД, таких как oracle, поскольку этап подготовки обрабатывается на стороне сервера
для обеспечения мягкого анализа для ускорения производительности.
Так что такой код, возможно, просто подходит для mysql.