在一些指南的帮助下,我用gcc成功编译了sqlite3的ICU扩展,并获得了libSqliteIcu.so,没有显示任何错误。然后我将这个lib复制到/ usr / lib文件夹。之后我通过终端和“.load libSqliteIcu.so”然后“icu_load_collation(”hr_HR“,”CROATIAN“)激活sqlite;”所有没有错误或终端上的备注。查询结果现在正确排序。
我现在要做什么才能通过c-api使用克罗地亚的整理?
我试试:
sqlite3_stmt *selStmt;
const char *zSqlSelect = "SELECT sif, name, kat FROM mytable WHERE naziv LIKE 'mala%' ORDER BY naziv COLLATE CROATIAN;";
if (sqlite3_prepare_v2(db, zSqlSelect, -1, &selStmt, NULL) == SQLITE_OK )
{
int cols = sqlite3_column_count(selStmt);
int result = 0;
while(true)
{
result = sqlite3_step(selStmt);
if(result == SQLITE_ROW)
{
for(int col = 0; col < cols; col++)
{
printf("%s %s \t", sqlite3_column_name(selStmt,col), "=");
printf("%s\n", sqlite3_column_text(selStmt, col));
}
}
else break;
}
sqlite3_finalize(selStmt);
}
else
printf("db error: %s\n", sqlite3_errmsg(db));
错误消息是“db error:no collation sequence:CROATIAN”。
如果通过c-api进行整理,我会错过什么以及如何通过命令行获取sqlite3 sort propery?
答案 0 :(得分:2)
我找到解决方案,所以这里就像一个下水道。 在打开数据库之后,应该立即进行此操作,然后您可以在查询中使用排序规则名称来获取不区分大小写并正确排序的结果。 尽管克罗地亚的例子我认为这可以应用于ICU支持的所有校对。
if (sqlite3_enable_load_extension(db, 1) == SQLITE_OK)
{
printf ("loading extensions enabled\n");
const char* library;
#if defined(linux)
library = "path_to/libSqliteIcu.so";
#else
library = "path_to\libSqliteIcu.dll";
#endif
if (sqlite3_load_extension(db, library, 0, 0) == SQLITE_OK)
{
sqlite3_stmt *collation;
if (sqlite3_prepare_v2(db, "SELECT icu_load_collation('hr_HR', 'CROATIAN');", -1, &collation, 0) != SQLITE_OK)
printf("db error: %s\n", sqlite3_errmsg(db));
if (collation)
sqlite3_step(collation);
else
printf("Error: collation is not loaded");
sqlite3_finalize(collation);
}
else
printf ("Error: libSqliteIcu NOT loaded\n");
}
else
printf("Error: enable_load_extension\n");
if (sqlite3_enable_load_extension(db, 0) == SQLITE_OK) printf ("loading extensions disabled\n");
因此只留下一个相关问题:
当我们以这种方式使用sqlite时如何获得区分大小写的搜索?
我尝试了COLLATE BINARY,它再次不区分大小写了。