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

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

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

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

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

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

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

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

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

 String mystring = "Sample's"; String myfinalstring = mystring.replace("'","''"); String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')"; 

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

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

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

пример:

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

В 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("'", "''"); } 
  • Пример программы sqlite в android
  • Таблица SQL со строкой «список» и таблицей SQL со строкой для каждой записи
  • Скорость вставки SQLite замедляется по мере увеличения количества записей из-за индекса
  • Адаптер DB для нескольких таблиц SQLite для Android?
  • Вставка имени таблицы в запрос дает sqlite3.OperationalError: рядом с «?»: Синтаксическая ошибка
  • Проблемы с Sqlite с HTC Desire HD
  • ALTER COLUMN в sqlite
  • Каковы наилучшие практики для SQLite на Android?
  • SQLite UPSERT / UPDATE ИЛИ INSERT
  • Заполнить базу данных Android из файла CSV?
  • Измените тип столбца в sqlite3
  • Давайте будем гением компьютера.