Краткий ответ: да, если вы исправите цитирование, они должны дать одинаковые результаты. Знак процента не будет "удален" из подготовленного оператора, как и любой другой символ.
Более длинный ответ: вопрос о подготовленном операторе и одноразовом операторе может быть сложным. Если вы собираетесь выполнить его только один раз, подготовленный оператор займет больше времени, потому что механизм базы данных должен выполнить всю настройку для подготовленного оператора, затем вставить значения, а затем оставить его в кэше, пока механизм не примет решение. чтобы смыть его. Кроме того, оптимизатор часто не может эффективно обрабатывать подготовленный оператор. Весь смысл подготовленного оператора заключается в том, что оптимизатор один раз анализирует запрос и разрабатывает план запроса. Предположим, вы говорите что-то вроде «выберите имя_клиента из списка клиентов, где тип_покупателя=? и имя_клиента=?». У вас есть индексы как по типу, так и по почтовому индексу. С одноразовым оператором (конечно, с заполненными реальными значениями, а не вопросительными знаками) оптимизатор запросов во многих механизмах баз данных может просмотреть статистику распределения значений для двух полей и выбрать индекс, который даст меньшее значение. набор записей, затем прочитайте их все последовательно и исключите записи, не прошедшие второй тест. С подготовленным оператором он должен выбрать индекс, прежде чем узнает, какие значения будут предоставлены, поэтому он может выбрать менее эффективный индекс.
Вы никогда не должны под страхом смерти когда-либо писать код, который просто заключает в кавычки неизвестное значение и вставляет его в оператор SQL. Либо используйте подготовленные операторы, либо напишите функцию, которая правильно экранирует любые встроенные кавычки. Такую функцию легко написать. Я не понимаю, почему JDBC не включает его, поэтому вы должны написать его самостоятельно и включать в каждое приложение. (Это особенно верно, учитывая, что в некоторых диалектах SQL есть символы, отличные от одинарных кавычек, которые следует экранировать.)
Вот пример такой функции в Java:
public static String q(String s)
{
if (s==null)
return "null";
if (s.indexOf('\'')<0)
return "'"+s+"'";
int sl=s.length();
char[] c2=new char[sl*2+2];
c2[0]='\'';
int p2=1;
for (int p=0;p<sl;++p)
{
char c=s.charAt(p);
if (c=='\'')
c2[p2++]=c;
c2[p2++]=c;
}
c2[p2++]='\'';
return new String(c2,0,p2);
}
(Примечание: я только что отредактировал эту функцию из версии, которую я вытащил из своего кода, чтобы исключить некоторые особые случаи, не относящиеся к делу — извините, если я допустил некоторые незначительные ошибки при этом.)
Обычно я даю ему очень короткое имя, например «q», поэтому я могу просто написать:
String sql="select customer_name from customer where customer_type="+q(custType)
+" and customer_zip="+q(custZip);
или что-то быстрое и легкое в этом роде. Это нарушение принципа «давать функциям полные и осмысленные имена», но я думаю, что здесь это целесообразно, поскольку я могу использовать одну и ту же функцию десять раз в одном выражении.
Затем я перегружаю его, чтобы он принимал даты, числа и другие специальные типы и обрабатывал их соответствующим образом.
person
Community
schedule
14.05.2009