Escape символ одинарной кавычки для использования в запросе SQLite

180

Я написал схему базы данных (пока только одну таблицу) и операторы 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-символе для одинарной кавычки. Я также попытался дважды избежать одиночной кавычки (используя \\\'вместо \'), но это тоже не сработало. Что я делаю не так?

JPM
источник

Ответы:

294

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

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

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

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

Райан Гилл
источник
8
Кроме того, рассмотрите возможность использования связанных параметров, если их поддерживает основной язык (большинство так и делает, но оболочка SQLite этого не делает). Тогда SQL будет INSERT INTO table_name (field1, field2) VALUES (?, ?)и значения будут предоставлены напрямую (и без подстановок).
Donal Fellows
1
Разве мы не можем просто использовать двойные кавычки? например: INSERT INTO table_name (field1, field2) VALUES (123, «Привет, есть»); ?
JacksOnF1re
Кроме того, в зависимости от времени жизни строки, первым шагом может быть преобразование '' в ', прежде чем снова удвоить их.
Гэри Z
44

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

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
overslacked
источник
10

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

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

пример:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
M.Fahri
источник
6

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

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

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

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

Чарли Д. Эупенья
источник
0

В 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("'", "''");
}
sapbucket
источник
0

В сценариях bash я обнаружил, что экранирование двойных кавычек вокруг значения необходимо для значений, которые могут быть нулевыми или содержать символы, требующие экранирования (например, дефисы).

В этом примере значение columnA может быть нулевым или содержать дефисы.

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
Дэн Таннер
источник