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-символе для одной кавычки. Я также попытался удвоить выход из одной кавычки (используя \\\'
вместо \'
), но это тоже не сработало. Что я делаю не так?
- В чем разница между связанными типами данных SQLite, такими как INT, INTEGER, SMALLINT и TINYINT?
- Ruby: SQLite3 :: BusyException: firebase database заблокирована:
- Как перечислить таблицы в файле базы данных SQLite, который был открыт с помощью ATTACH?
- Есть ли SQLite-эквивалент DESCRIBE MySQL?
- Как получить список имен столбцов на sqlite3 / iPhone?
- База данных SQLite3 или диск заполнен / образ диска базы данных неверен
- Самый простой код для заполнения JTable из ResultSet
- не может загрузить такой файл - sqlite3 / sqlite3_native (LoadError) на rubyе на рельсах
- SQLITE3 VACUUM, «firebase database или диск заполнен»
- Как восстановить поврежденную базу данных SQLite3?
- Как удалить или добавить столбец в SQLITE?
- Как просмотреть данные в файле sqlite, запущенном в приложении iphone?
- Как конкатенировать строки с заполнением в sqlite
Попробуйте удвоить одиночные кавычки (многие базы данных ожидают этого), поэтому это будет:
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("'", "''"); }