对sqlite查询大小有限制吗?



选择语句的大小是否有限制?例如,假设我有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);

粗略地说,默认限制是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注入攻击的风险。它也运行得更快,因为大字符串不需要解析或复制那么多。

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

编辑:26/10/2022正如Tobias在他的评论中解释的那样,链接的文章现在描述默认的最大长度如下:

SQL语句最大长度SQL语句文本的最大字节数限制为SQLITE_MAX_SQL_LENGTH,默认为1,000,000,000。

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

最新更新