【问题标题】:Is there any limit on sqlite query size?sqlite 查询大小有限制吗?
【发布时间】:2014-07-01 12:48:19
【问题描述】:

选择语句的大小是否有限制? 例如,假设我有 100 个失败的学生作为选择,我下面的代码可以工作吗?

ArrayList<Long> ids_toupdate = getFailedStudents();// has size 100.
String selection = String.format(Locale.US, STUDENT._ID + " IN (%s)",TextUtils.join(", ", ids_toupdate));
ContentValues cv = new ContentValues();
cv.put(RawContacts.FAILED, 1);
getContentResolver().update(STUDENT.CONTENT_URI,cv, selection, null);

【问题讨论】:

  • 请注意,由于 the standard 于 2010 年被放弃,供应商可以在 webSQL(这是事实上的 SQLite 实现)中设置自己的未记录限制(或完全放弃支持)。

标签: android sql sqlite


【解决方案1】:

粗略地说,默认限制是 1,000,000 字节或 1,000,000 个字符,因此除非您的“学生”每个语句超过 100,000 个字符,否则您的陈述应该没问题。

以下摘自http://www.sqlite.org/limits.html

SQL 语句的最大长度

SQL 语句文本中的最大字节数限制为 SQLITE_MAX_SQL_LENGTH,默认为 1000000。您可以将此限制重新定义为与 SQLITE_MAX_LENGTH 和 1073741824 中的较小者一样大。

如果 SQL 语句的长度限制为一百万字节,那么显然您将无法通过将数百万字节的字符串作为文字嵌入到 INSERT 语句中来插入它们。但无论如何你都不应该那样做。为您的数据使用主机参数。像这样准备简短的 SQL 语句:

INSERT INTO tab1 VALUES(?,?,?); 

然后使用 sqlite3_bind_XXXX() 函数将您的大字符串值绑定到 SQL 语句。使用绑定避免了对字符串中的引号字符进行转义,降低了 SQL 注入攻击的风险。它的运行速度也更快,因为不需要对大字符串进行太多解析或复制。

可以在运行时使用 sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size) 接口降低 SQL 语句的最大长度。

【讨论】:

    【解决方案2】:

    还有 SQLITE_MAX_VARIABLE_NUMBER 限制查询中的变量数量。默认值为 999,但某些发行版使用更高的设置编译。

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多