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

128

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

Теги:
sqlite3
escaping

5 ответов

217
Лучший ответ

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

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

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

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

  • 7
    Кроме того, рассмотрите возможность использования связанных параметров, если их поддерживает основной язык (большинство это делает, а оболочка SQLite - нет). Тогда SQL будет INSERT INTO table_name (field1, field2) VALUES (?, ?) значения будут предоставлены напрямую (без подстановок).
  • 0
    Разве мы не можем просто использовать двойные кавычки? например: INSERT INTO table_name (field1, field2) VALUES (123, «Привет!»); ?
Показать ещё 1 комментарий
41

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

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

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

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

пример:

sample = "St. Mary and St. John's";
escapedSample = sample.replace(/\'/g,"''")
1

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

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

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

это работает для меня в С# и java

0

В С# вы можете использовать следующее, чтобы заменить одиночную кавычку двойной кавычкой:

 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("'", "''");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню