Уникнути символу єдиної цитати для використання в запиті 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');

Проблема полягає в символі втечі для однієї цитати. Я також спробував подвійне уникнути єдиної цитати (використовуючи \\\'замість \'), але це теж не вийшло. Що я роблю неправильно?

Відповіді:


294

Спробуйте подвоїти одиничні котирування (багато баз даних очікують саме так), так було б:

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

Відповідна цитата з документації :

Строкова константа формується шляхом додавання рядка в одиничні лапки ('). Одну цитату в рядку можна закодувати, поставивши дві одиничні лапки в ряд - як у Pascal. Стрибки в стилі C за допомогою символу зворотної косої риси не підтримуються, оскільки вони не є стандартними SQL. Літерали BLOB - це рядкові літерали, що містять шістнадцяткові дані та передують одному символу "x" або "X". ... Буквальним значенням може бути також маркер "NULL".


8
Крім того, розгляньте можливість використання зв'язаних параметрів, якщо мова хосту підтримує їх (більшість, але оболонка SQLite не робить). Тоді буде SQL, INSERT INTO table_name (field1, field2) VALUES (?, ?)і значення подаватимуться безпосередньо (і без підстановок).
Дональні стипендіати

1
Чи не можемо ми просто використовувати подвійні лапки? як: ВСТАВИТИ INTO table_name (field1, field2) VALUES (123, "Hello there"); ?
JacksOnF1re

Також, залежно від терміну експлуатації рядка, першим кроком може бути перетворення '' в '', перш ніж повторно подвоїти їх.
Gary Z

44

Я вважаю, що ви хочете врятуватися, подвоївши єдину цитату:

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

10

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

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

приклад:

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

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

0

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

У цьому прикладі значення стовпцяA може бути нульовим або містити дефіси .:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.