在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将我的连字符视为连字符而不是减号?
答案 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会根据其解释应存储的类型的方式存储值。