SQLite C 接口

定义新的整理顺序

int sqlite3_create_collation(
  sqlite3*,
  const char *zName,
  int eTextRep,
  void *pArg,
  int(*xCompare)(void*,int,const void*,int,const void*)
);
int sqlite3_create_collation_v2(
  sqlite3*,
  const char *zName,
  int eTextRep,
  void *pArg,
  int(*xCompare)(void*,int,const void*,int,const void*),
  void(*xDestroy)(void*)
);
int sqlite3_create_collation16(
  sqlite3*,
  const void *zName,
  int eTextRep,
  void *pArg,
  int(*xCompare)(void*,int,const void*,int,const void*)
);

这些函数添加、删除或修改与指定为第一个参数的数据库连接关联的排序规则。

排序规则的名称是 sqlite3_create_collat​​ion() 和 sqlite3_create_collat​​ion_v2() 的 UTF-8 字符串,以及 sqlite3_create_collat​​ion16() 的本地字节顺序的 UTF-16 字符串。根据sqlite3_strnicmp()比较相等的排序规则名称被认为是相同的名称。

第三个参数 (eTextRep) 必须是常量之一:

eTextRep 参数确定传递给整理函数回调 xCompare 的字符串的编码。eTextRep的SQLITE_UTF16SQLITE_UTF16_ALIGNED值强制字符串为具有本机字节顺序的 UTF16。eTextRep的SQLITE_UTF16_ALIGNED值强制字符串从偶数字节地址开始。

第四个参数 pArg 是一个应用程序数据指针,它作为第一个参数传递给整理函数回调。

第五个参数 xCompare 是指向整理函数的指针。可以使用相同的名称但使用不同的 eTextRep 参数注册多个整理函数,SQLite 将使用需要最少数据转换的函数。如果 xCompare 参数为 NULL,则删除整理函数。当删除所有具有相同名称的整理功能时,该整理将不再可用。

使用 pArg 应用程序数据指针的副本和 eTextRep 参数指定的编码中的两个字符串调用整理函数回调。整理函数回调的两个整数参数是两个字符串的长度,以字节为单位。如果第一个字符串分别小于、等于或大于第二个字符串,则整理函数必须返回一个负整数、零整数或正整数。给定相同的输入,整理函数必须始终返回相同的答案。如果两个或多个整理函数注册到相同的整理名称(使用不同的 eTextRep 值),那么在使用等效字符串调用时,所有函数都必须给出等效的答案。整理函数必须遵守所有字符串 A、B 和 C 的以下属性:

  1. 如果 A==B 则 B==A。
  2. 如果 A==B 且 B==C 则 A==C。
  3. 如果 A<B 则 B>A。
  4. 如果 A<B 且 B<C,则 A<C。

如果一个整理函数没有满足上述任何约束,并且该整理函数被注册和使用,那么 SQLite 的行为是未定义的。

sqlite3_create_collat​​ion_v2() 的工作方式与 sqlite3_create_collat​​ion() 类似,只是在删除整理函数时会在 pArg 上调用 xDestroy 回调。当以后调用归类创建函数或使用sqlite3_close()关闭数据库连接时,归类函数将被删除

如果 sqlite3_create_collat​​ion_v2() 函数失败,则不会调用xDestroy 回调。使用非 NULL xDestroy 参数调用 sqlite3_create_collat​​ion_v2() 的应用程序应该检查返回代码并自行处理应用程序数据指针,而不是期望 SQLite 为它们处理它。这与所有其他 SQLite 接口不同。不一致是不幸的,但在不破坏向后兼容性的情况下无法更改。

另见: sqlite3_collat​​ion_needed()sqlite3_collat​​ion_needed16()

另请参阅 对象常量函数的列表。