【问题标题】:What characters cannot be used for values in SQLite databases?SQLite 数据库中的值不能使用哪些字符?
【发布时间】:2011-11-08 05:39:39
【问题描述】:

我正在制作一个 Android 应用程序,并且我使用了一个 SQLite 数据库。但我发现如果您键入单引号 (') 之类的字符(也用作主键),数据将无法正确保存/检索。

这是我的问题还是真的?如果是真的还有这样的角色吗?

谢谢。

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

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

【问题讨论】:

  • 官方 SQLite 文档 (sqlite.org/docs.html) 总是有的,但更多的是关于一般问题和 C/C++ 接口。不过,在 Google 上搜索“android sqlite 占位符教程”可能会有所收获。
  • @mu 再次感谢您的提示!我会谷歌它。

标签: android sql database sqlite character


【解决方案1】:

您可能会遇到 ASCII STOP 之类的字符和此类非打印字符的问题,但如果您使用准备好的语句和参数绑定,即使使用诸如 ' 之类的字符也不会有任何问题。

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

SQL 通常使用' 作为其特殊字符来判断字符串文字何时开始或停止。如果您的输入包含此字符,它将停止将当前行视为字符串并开始将其视为命令。这不是一件好事,安全方面。它还阻止您输入该字符,除非您通过在其前面放置一个反斜杠来“转义”它,这告诉 SQL 忽略 ' 并继续将以下字符视为字符串,直到遇到未转义的 '。当然,反斜杠文字也被转义为双反斜杠。

准备好的语句通常如下所示:

String sql = "INSERT INTO MYTABLE (NAME, EMP_NO, DATE_HIRED) VALUES (?, ?, ?)";
PreparedStatement ps = sqlite.prepareStatement(sql);
ps.setString(1, myString);
ps.setInt(2, myInt);
ps.setDate(3, myDate);
ps.executeUpdate();

很遗憾,我不知道您将使用哪个库从 Android 访问 sqlite,因此我目前无法为您提供更多详细信息。

【讨论】:

  • 感谢您的回答。它工作得很好。所以只有' 字符应该被“转义”(在一个典型的例子中——比如说,像一个待办事项)?
  • @Roshnal:在典型情况下,您应该使用带有占位符的准备好的语句,然后将值绑定到占位符,并让库担心需要转义的内容以及需要如何完成。避免使用字符串连接构建完整的 SQL 语句,它看起来既快速又简单,直到它炸毁并在整个地方留下一团糟。
  • @mu 感谢您的警告 :) 但是我在哪里可以找到有关准备好的语句和占位符的更多信息?由于我是 SQLite 新手,因此我对此知之甚少。因此,如果您可以将我引导至某个链接(或将其发布在此处),那真的会对我有所帮助。
  • @Roshnal,也许谷歌搜索或阅读 PreparedStatement javadocs 可能是一个开始。
  • @bdares 非常感谢您提供的代码!它真的帮助了我。但是我使用的“库”是什么意思?我只是使用 Android 的内置函数。所以我也应该使用图书馆?
【解决方案2】:

SQLite 语句对字符串使用引号(单引号或双引号)。例如,如果您需要插入带有 (') 的字符串,您可以使用双引号 (") 来包装字符串:

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

或者反过来:

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

(当然,您需要对 Java 代码中的任何 (") 进行转义。)

另一种方法是使用SQLiteStatment(准备好的语句)和bindString()

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 但是我可以在 TEXT 类型的字段中输入 any 字符吗?
    猜你喜欢
    • 2019-10-26
    • 2021-03-24
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    相关资源
    最近更新 更多