在一些指南的帮助下,我和gcc一起成功地编译了sqlite3的ICU扩展,并获得了libSqliteIcu.so,没有显示一个错误。然后,我将这个库复制到/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错误:没有这样的排序规则序列:克罗地亚语“。
我错过了什么,以及如何通过c-api获得给定排序规则的sqlite3排序属性,就像通过命令行一样?
发布于 2012-03-23 14:43:47
我找到了解决方案,所以这里就像是一个ansewer。打开数据库后,应该立即执行此操作,然后可以在查询中使用排序规则名称,以获得不区分大小写和正确排序的结果。尽管有克罗地亚的例子,但我认为这可以应用于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时,如何像搜索一样区分大小写?
我尝试整理二进制文件,它再次不区分大小写。
https://stackoverflow.com/questions/9826477
复制相似问题