SQLite рассматривает дефисы как арифметические операторы - PullRequest
0 голосов
/ 29 апреля 2019

В приложении React Native я пытаюсь вставить данные в локальную базу данных sqlite db

    let submissionID = "1-2-3";
    this.dbQuery("INSERT INTO Submissions (ID, Data) VALUES("+submissionID+",'Test')");

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

Если бы я просматривал таблицу Submissions после этого оператора вставки, я бы ожидал увидеть строку с [ID: "1-2-3", Data: "Test"], но вместо этого я вижу [ID: "- 4", Данные: "Тест"]

Я создал таблицу примерно так:

CREATE TABLE IF NOT EXISTS Submissions(ID BLOB PRIMARY KEY NOT NULL, Data BLOB NOT NULL)

Я использовал Blob, потому что я прочитал «Значение - это блок данных, хранящийся в точностикак это было вход ".но я также пробовал текст.Я также преобразовал submissionID в строку типа*

Но ничего из этого не сработало.Я вижу здесь, как sqlite использует преимущества арифметических операторов https://www.w3resource.com/sqlite/arithmetic-operators.php, но я не уверен, как помешать ему сделать это.

Как заставить sqlite рассматривать дефисы как дефисы вместознаки вычитания?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

То, что вы делаете, является эквивалентом:

this.dbQuery("INSERT INTO Submissions (ID, Data) VALUES(1-2-3,'Test')");

передачи числового выражения 1-2-3 в оператор INSERT.Самое простое решение - заключить строковый литерал в кавычки.

let submissionID = "1-2-3";
this.dbQuery("INSERT INTO Submissions (ID, Data) VALUES('"+submissionID+"','Test')");

Однако, чтобы защититься от атак с использованием SQL-инъекций, вам действительно следует использовать подготовленные операторы вместо использования конкатенации строк для построения SQLзаявления.

1 голос
/ 29 апреля 2019

Заключите строку в одинарные кавычки, т. Е.

this.dbQuery("INSERT INTO Submissions (ID, Data) VALUES('"+String(submissionID)+"','Test')");

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

Тип данных (сходство столбцов) имеет мало значения, кроме того, что если вы указали ID INTEGER PRIMARY KEY, то вы не смогли бы сохранитьничего, кроме целого числа.Поскольку ключ ID INTEGER PRIMARY имеет специальную интерпретацию, то есть столбец является псевдонимом rowid.

Я использовал Blob, потому что я прочитал: «Значение представляет собой большой двоичный объект данных, которые хранятся в точности так, как они были введены».«.но я также пробовал текст.Я также привел submissionID в виде строки типа

Это только в том случае, если значение для вставки является BLOB-байтом [] или в случае необработанного SQL x'FF01FE02 ', в противном случае SQLite будетсохранить значение в соответствии с тем, как оно интерпретирует, тип должен быть сохранен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...