哪些字符不能用于SQLite数据库中的值?

时间:2011-09-01 08:40:48

标签: android sql database sqlite character

我正在制作Android应用,我使用过SQLite数据库。但是我发现如果你输入单引号(')等字符(也用作主键),数据将无法正确保存/检索。

这是我的问题还是真的?如果真的还有那样的字符吗?

感谢。

@bdares和@mu感谢您的提示,但是您能告诉我如何在SQLite中使用占位符和/或预处理语句吗?

我之前总是使用直接字符串连接,但是现在看来这是一种不好的做法,我想使用准备好的语句和/或占位符。

3 个答案:

答案 0 :(得分:4)

可能你会遇到像ASCII STOP这样的字符和非打印字符这样的问题,但是如果你使用预备语句和参数绑定,即使使用像'这样的字符也不会有任何问题。

如果您不想使用参数绑定和预处理语句,可以将所有输入'替换为\',您就可以了。

SQL通常使用'作为其特殊字符来告知字符串文字何时开始或停止。如果您的输入具有此字符,它将停止将当前行视为字符串并开始将其视为命令。这不是一件好事,安全明智。它还可以防止您输入该字符,除非您通过在其前面放置反斜杠来“逃避”该字符,这会告诉SQL忽略'并继续将以下字符视为字符串,直到未转义为{{1}满足了。当然,反斜杠文字也会以双反斜杠的形式进行转义。

预备语句通常如下所示:

'

不幸的是,我不确切知道你用什么库从Android访问sqlite,所以我现在不能给你更多细节。

答案 1 :(得分:1)

SQLite语句对字符串使用引号 - 单引号或双引号。例如,如果需要用(')INSERT一个字符串,可以使用双引号(“)来包装字符串:

INSERT INTO my_table (some_column) VALUES("'a string'");

或者反过来说:

INSERT INTO my_table (some_column) VALUES('"a string"');

(当然,您需要在Java代码中转义任何(“)。”

另一种方法是使用SQLiteStatment(Prepared语句)和bindString()

对于“允许的字符”,SQLite在内部将字符串(类型TEXT)存储为UTF-8或UTF-16。 Android的版本使用默认的UTF-8。因此,您可以存储任何字符串。

答案 2 :(得分:0)

SQLite支持数据类型TEXT(类似于Java中的String),INTEGER(类似于Java中的long)和REAL(类似于Java中的double)。在将这些类型保存到数据库之前,必须将所有其他类型转换为这些字段。 SQLight本身不验证写入列的类型是否实际上是已定义的类型,您可以将整数写入字符串列。