SQLite将连字符视为算术运算符

时间:2019-04-29 20:07:27

标签: sqlite react-native

在React Native应用中,我试图将数据插入本地sqlite数据库中

    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,是因为我读到“该值是数据的Blob,其存储方式与输入时完全相同。”但我也尝试过Text。我也已将SubmitID转换为类似这样的字符串

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

但是这些都不起作用。我确实在这里看到sqlite如何利用算术运算符 https://www.w3resource.com/sqlite/arithmetic-operators.php 但我不确定如何阻止它。

我如何让sqlite将我的连字符视为连字符而不是减号?

2 个答案:

答案 0 :(得分:2)

您正在做的事情等同于:

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注入攻击,您确实应该使用prepared statements而不是使用字符串连接来构建SQL语句。

答案 1 :(得分:1)

将字符串用单引号引起来

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

因此,SQLite将该值视为文字,而不将其括起来,将其视为数字值或标识符(列,表,触发器,视图,具体取决于编码的位置以及解析器的内容)期望)。

除了指定ID INTEGER PRIMARY KEY以外,数据类型(列关联性)几乎没有影响,那么您将无法存储除整数以外的任何内容。由于ID INTEGER PRIMARY键具有特殊的解释,即列是rowid的别名。

  

我使用Blob是因为我读到“该值是存储的数据Blob   完全按照输入的方式进行。”但我也尝试过Text。我也进行了投射   

仅当要插入的值是BLOB字节[]或原始SQL x'FF01FE02'时,否则SQLite会根据其解释应存储的类型的方式存储值。