如何将双引号 ( " ) 插入 SQLite 数据库 Varchar 字段?
Posted
技术标签:
【中文标题】如何将双引号 ( " ) 插入 SQLite 数据库 Varchar 字段?【英文标题】:How can i insert double quote ( " ) into SQLite Database Varchar field? 【发布时间】:2011-11-30 14:53:21 【问题描述】:我正在尝试用该字段TITLE varchar(200) NOT NULL
将下一句插入到表中:
INSERT OR IGNORE INTO EXAMPLETABLE VALUES ("1-Preludi \"Obrint Pas 2011\"", ...
问题是 SQLite 误解了 \" 转义字符,我不知道如何解决我的 android 程序中的问题(可能是字符代码?)。
【问题讨论】:
【参考方案1】:仅使用命令行中的 sqlite 和直接 sql insert 命令,我发现双引号会自行转义。 用你的例子
INSERT OR IGNORE INTO EXAMPLETABLE VALUES ("1-Preludi ""Obrint Pas 2011""", ...
【讨论】:
【参考方案2】:要将值插入数据库,您应该始终使用SQLiteStatement (HowTo),因为它们会转义您的值并防止您的应用成为SQL-Injections 的目标。
此外,如果您要插入多个值(比如在循环中),执行具有不同绑定值的预编译语句比正常的插入语句要快得多。
【讨论】:
实际上,您应该使用 Android 特别提供的 SQLite 接口,并将值作为 ContentValues 传递,使用(例如)SQLiteDatabase#insert(String, String, ContentValues) 方法。 @Jens 你是对的,在 Android 中插入参数被转义了。但是大多数人只提供原始查询并将参数留给Null
。这就是为什么我建议使用普通的 PreparedStatement。
啊,您指的是使用 SQLiteStatement:s,而不是实际的标准 Java PreparedStatements。
@Jens 是的,我打算去,但我从文档中得到了错误的课程。我的错。【参考方案3】:
尝试类似的方法:
ContentValues values = new ContentValues();
values.put("YOURCOLUMNNAME", "1-Preludi \"Obrint Pas 2011\"");
// ... other stuff you want to insert ...
SQLiteDatabase db = ... ; // Usually obtained using a SQLiteOpenHelper
long id = db.insertWithOnConflict("EXAMPLETABLE", BaseColumns._ID, values, SQLiteDatabase.CONFLICT_IGNORE);
【讨论】:
【参考方案4】:使用它来插入任何特殊字符的数据
ContentValues initialValues = new ContentValues();
initialValues.put("Id", id);
initialValues.put("Name", Name);
// ...
myDataBase.insert("EXAMPLETABLE", null, initialValues);
【讨论】:
【参考方案5】:试试这个:
INSERT OR IGNORE INTO EXAMPLETABLE VALUES ('1-Preludi "Obrint Pas 2011"', ...
【讨论】:
+1 我试过了,但我遇到了 ' :D 的问题,然后这个解决方案无法运行,但如果你只有 " 的问题,它很容易。 如果您的输入混合了单/双引号,这将中断。以上是关于如何将双引号 ( " ) 插入 SQLite 数据库 Varchar 字段?的主要内容,如果未能解决你的问题,请参考以下文章
sqli-labs less10 GET - Blind - Time based. - Double quotes (基于时间的双引号盲注)