Escape символ одинарной кавычки для использования в запросе SQLite - PullRequest
149 голосов
/ 02 марта 2009

Я написал схему базы данных (пока только одну таблицу) и операторы INSERT для этой таблицы в одном файле. Затем я создал базу данных следующим образом:

$ sqlite3 newdatabase.db
SQLite version 3.4.0
Enter ".help" for instructions
sqlite> .read ./schema.sql
SQL error near line 16: near "s": syntax error

Строка 16 моего файла выглядит примерно так:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');

Проблема в том, что для одиночной кавычки используется escape-символ. Я также попытался дважды избежать одиночной кавычки (используя \\\' вместо \'), но это тоже не сработало. Что я делаю не так?

Ответы [ 5 ]

256 голосов
/ 02 марта 2009

Попробуйте удвоить одинарные кавычки (так ожидают многие базы данных), так что это будет:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

Соответствующая цитата из документации :

Строковая константа формируется заключением строки в одинарные кавычки ('). Одиночная кавычка в строке может быть закодирована путем помещения двух одинарных кавычек в строку - как в Паскале. Экранирование в стиле C с использованием символа обратной косой черты не поддерживается, поскольку они не являются стандартными SQL. BLOB-литералы - это строковые литералы, содержащие шестнадцатеричные данные и начинающиеся с одного символа «x» или «X». ... Литеральным значением также может быть токен "NULL".

42 голосов
/ 02 марта 2009

Полагаю, вы захотите убежать, удвоив одинарную цитату:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
7 голосов
/ 04 января 2018

для замены всех (') в вашей строке, используйте

.replace(/\'/g,"''")

пример:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
2 голосов
/ 11 декабря 2017

На всякий случай, если у вас есть цикл или строка json, которые нужно вставить в базу данных. Попробуйте заменить строку одинарной кавычкой. вот мое решение. Например, если у вас есть строка, содержащая одинарную кавычку.

String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";

это работает для меня в C # и Java

0 голосов
/ 06 декабря 2017

В C # вы можете использовать следующее для замены одинарных кавычек на двойные:

 string sample = "St. Mary's";
 string escapedSample = sample.Replace("'", "''");

И вывод будет:

"St. Mary''s"

И, если вы работаете с Sqlite напрямую; вы можете работать с объектом вместо строки и ловить специальные вещи, такие как DBNull:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...