Название: Как экранировать одинарную кавычку для 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" Название: 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 maintext = "Noch'. Ulica. Fonar'." Его нужно записать в базу: QString sql = QString("INSERT INTO mtable (aText) Values('%1')").arg(maintext); QSqlQuery query; query.exec(sql); Как подготовить переменную maintext, что бы запрос выполнился без ошибки? Хотя бы так Название: 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", ну да ладно.........проблема в следующем есть текст, например: Тебе же уже ответили bindValueQString maintext = "Noch'. Ulica. Fonar'." Его нужно записать в базу: QString sql = QString("INSERT INTO mtable (aText) Values('%1')").arg(maintext); QSqlQuery query; query.exec(sql); Как подготовить переменную maintext, что бы запрос выполнился без ошибки? Код
Название: 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 Откуда вообще информация, что параметризованные запросы 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 плана. Я это и имел ввиду, говоря "каждый раз", как уже пояснили выше ;) |