Russian Qt Forum

Qt => Базы данных => Тема начата: wolfut от Сентябрь 28, 2011, 14:18



Название: Как экранировать одинарную кавычку для SQLite
Отправлено: wolfut от Сентябрь 28, 2011, 14:18
Доброго времени суток!

Как экранировать одинарные кавычки, которые содержатся в строке, вставляемой в базу данных?

.replace(QString("'"),QString("\'")) и .replace(QString("'"),QString("\\'")) не работают((


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: LisandreL от Сентябрь 28, 2011, 14:29
Use the QSqlQuery::bindValue, Luke!
Костыль этот не нужен тебе.


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: andrew.k от Сентябрь 28, 2011, 16:07
а зачем их экранировать? и так должно все работать.

q.prepare ( "select * from table where name='value'" ) ;


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Rem Norton от Сентябрь 28, 2011, 22:47
Кавычки в SQLite экранируются такими же кавычками. Например:
Код:
insert into table (txt) values ("Never say ""never"""); -- вставится: Never say "never"
insert into table (txt) values ('Don''t cry'); -- вставится Don't cry


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: andrew.k от Сентябрь 29, 2011, 09:54
речь то шла о коде C++, а не о запросе SQL


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: LisandreL от Сентябрь 29, 2011, 10:03
речь то шла о коде C++, а не о запросе SQL
O RLY?
Тема: Как экранировать одинарную кавычку для SQLite


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: andrew.k от Сентябрь 29, 2011, 10:09
а ты только тему прочитал или сообщение от топикстартера тоже?

Не замечал, что название топиков очень часто не соответствуют содержанию?
Например, QProcess особенности (http://www.prog.org.ru/topic_19488_0.html)


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Rem Norton от Сентябрь 29, 2011, 10:53
Спор ниачом! Вопрос задан, ответ получен. Далее 2 варианта развития событий:
1. Топикстартер читает внимательно, включает мозг и будет ему счастье.
2. Топикстартер игнорирует информацию и это уже его проблемы.


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: wolfut от Сентябрь 29, 2011, 13:19
Тема всё-таки соответствует содержанию, я написал "для SQLite" а не "в SQLite", ну да ладно.........проблема в следующем есть текст, например: 

QString maintext = "Noch'. Ulica. Fonar'."

Его нужно записать в базу:

QString sql = QString("INSERT INTO mtable (aText) Values('%1')").arg(maintext);
QSqlQuery query;
query.exec(sql);

Как подготовить переменную maintext, что бы запрос выполнился без ошибки?


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Nimbus от Сентябрь 29, 2011, 13:21
Тема всё-таки соответствует содержанию, я написал "для SQLite" а не "в SQLite", ну да ладно.........проблема в следующем есть текст, например: 

QString maintext = "Noch'. Ulica. Fonar'."

Его нужно записать в базу:

QString sql = QString("INSERT INTO mtable (aText) Values('%1')").arg(maintext);
QSqlQuery query;
query.exec(sql);

Как подготовить переменную maintext, что бы запрос выполнился без ошибки?
QString maintext = "Noch''. Ulica. Fonar''."
Хотя бы так


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: wolfut от Сентябрь 29, 2011, 13:25
Нэт, так не пойдет мне нужно, что бы базе хранился именно исходный текст c одинарными кавычками: Noch'. Ulica. Fonar'. 


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Nimbus от Сентябрь 29, 2011, 13:29
Нэт, так не пойдет мне нужно, что бы базе хранился именно исходный текст c одинарными кавычками: Noch'. Ulica. Fonar'. 
'' != " присмотрись сам ;) Там два апострофа. При выполнении запроса они нужны, а в базу лягут уже по одному


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: wolfut от Сентябрь 29, 2011, 13:35
А точно, я подумал ты написал там ", а не ''.  Спасибо!!


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: andrew.k от Сентябрь 29, 2011, 13:36
Тема всё-таки соответствует содержанию, я написал "для SQLite" а не "в SQLite", ну да ладно.........проблема в следующем есть текст, например: 

QString maintext = "Noch'. Ulica. Fonar'."

Его нужно записать в базу:

QString sql = QString("INSERT INTO mtable (aText) Values('%1')").arg(maintext);
QSqlQuery query;
query.exec(sql);

Как подготовить переменную maintext, что бы запрос выполнился без ошибки?
Тебе же уже ответили bindValue
Код
C++ (Qt)
QString maintext = "Noch'. Ulica. Fonar'."
QString sql = QString("INSERT INTO mtable (aText) Values(:v)");
QSqlQuery query;
query.prepare (sql) ;
query.bindValue (":v", maintext) ;
query.exec(sql);
 



Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: andrew.k от Сентябрь 29, 2011, 13:37
Спор ниачом! Вопрос задан, ответ получен. Далее 2 варианта развития событий:
1. Топикстартер читает внимательно, включает мозг и будет ему счастье.
2. Топикстартер игнорирует информацию и это уже его проблемы.
Лень спорить с тобой, умник.


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: andrew.k от Сентябрь 29, 2011, 13:42
Нэт, так не пойдет мне нужно, что бы базе хранился именно исходный текст c одинарными кавычками: Noch'. Ulica. Fonar'. 
'' != " присмотрись сам ;) Там два апострофа. При выполнении запроса они нужны, а в базу лягут уже по одному

Потому что нужно было просто написать "экранируется второй кавычкой".
Но это не нужно. Ты ж не будешь везде добавлять вторую кавычку.
Нужно просто использовать bindValue


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Nimbus от Сентябрь 30, 2011, 04:57
Нужно просто использовать bindValue
Логично. Немного оффтопа:
Вообще, я считаю, что все данные в запрос надо передавать через параметры. Ибо такие крупные СУБД как Oracle и PostgreSQL (не знаю насчёт остальных) выполняют их быстрее, потому что не приходится каждый раз выполнять парсинг и строить план выполнения запроса, заодно это безопасно


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: MoPDoBoPoT от Сентябрь 30, 2011, 22:35
выполняют их быстрее, потому что не приходится каждый раз выполнять парсинг и строить план выполнения запроса, заодно это безопасно
Это если запрос многократно используется (:


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: fuCtor от Октябрь 02, 2011, 07:30
Если он используется лишь один раз, то как минимум не будет выигрыша по производительности, но зато меньше проблем со всякими символами, экранированием и тп. Да и логику при необходимости писать легче.


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Rem Norton от Октябрь 02, 2011, 17:00
Нужно просто использовать bindValue
Логично. Немного оффтопа:
Вообще, я считаю, что все данные в запрос надо передавать через параметры. Ибо такие крупные СУБД как Oracle и PostgreSQL (не знаю насчёт остальных) выполняют их быстрее, потому что не приходится каждый раз выполнять парсинг и строить план выполнения запроса, заодно это безопасно
ЛОЛШТО??? Спасибо, поржали всем офисом!


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: asvil от Октябрь 02, 2011, 17:45
Цитировать
ЛОЛШТО??? Спасибо, поржали всем офисом!
Умник детектед.

словосочетние
Цитировать
каждый раз
уже предполагает использование более одного раза.


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Nimbus от Октябрь 02, 2011, 18:10
ЛОЛШТО??? Спасибо, поржали всем офисом!
About?


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Rem Norton от Октябрь 02, 2011, 19:50
ЛОЛШТО??? Спасибо, поржали всем офисом!
About?
Откуда вообще информация, что параметризованные запросы Postgre выполняет быстрее??? Что-то в исходниках Postgre ни я, ни мои коллеги ничего такого не нарыли... НО поржали от души!


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: asvil от Октябрь 02, 2011, 19:54
Кодокопатели.

http://www.postgresql.org/docs/8.1/static/libpq-exec.html

Цитировать
PQprepare
............
    PQprepare creates a prepared statement for later execution with PQexecPrepared. This feature allows commands that will be used repeatedly to be parsed and planned just once, rather than each time they are executed.
............


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Rem Norton от Октябрь 02, 2011, 20:21
Кодокопатели.

http://www.postgresql.org/docs/8.1/static/libpq-exec.html

Цитировать
PQprepare
............
    PQprepare creates a prepared statement for later execution with PQexecPrepared. This feature allows commands that will be used repeatedly to be parsed and planned just once, rather than each time they are executed.
............

Для не знающих ангельского и презирающих on-line переводчики: ключевой момент фразы " ... commands that will be used repeatedly..." в переводе означает "команды, которые будут использоваться неоднократно". При единоразовом выполнении НИКАКОГО ПРИРОСТА СКОРОСТИ НЕ БУДЕТ. И так, для информации: все, уважающие себя СУБД имеют кэш запросов, в котором даже не параметризованный запрос хранится в виде execution плана. И, если запрос вызвать более одного раза, но с разными параметрами, он (какая неожиданность) выполнится быстрее, чем в первый раз.

И, да: коды рулят!  ;D


Название: Re: Как экранировать одинарную кавычку для SQLite
Отправлено: Nimbus от Октябрь 03, 2011, 04:13
При единоразовом выполнении НИКАКОГО ПРИРОСТА СКОРОСТИ НЕ БУДЕТ. И так, для информации: все, уважающие себя СУБД имеют кэш запросов, в котором даже не параметризованный запрос хранится в виде execution плана.
Я это и имел ввиду, говоря "каждый раз", как уже пояснили выше ;)