首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlite3、c-api、icu排序规则

Sqlite3、c-api、icu排序规则
EN

Stack Overflow用户
提问于 2012-03-23 00:26:14
回答 1查看 950关注 0票数 3

在一些指南的帮助下,我和gcc一起成功地编译了sqlite3的ICU扩展,并获得了libSqliteIcu.so,没有显示一个错误。然后,我将这个库复制到/usr/lib文件夹。在那之后,我通过终端和".load libSqliteIcu.so“,然后是"icu_load_collation (”hr_HR“,”CROATIAN“);”触发sqlite,这一切都在终端上没有错误或注释。

我现在应该怎么做才能通过c-api使用克罗地亚校对?

我试着:

代码语言:javascript
复制
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排序属性,就像通过命令行一样?

EN

回答 1

Stack Overflow用户

发布于 2012-03-23 14:43:47

我找到了解决方案,所以这里就像是一个ansewer。打开数据库后,应该立即执行此操作,然后可以在查询中使用排序规则名称,以获得不区分大小写和正确排序的结果。尽管有克罗地亚的例子,但我认为这可以应用于ICU支持的所有排序规则。

代码语言:javascript
复制
    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时,如何像搜索一样区分大小写?

我尝试整理二进制文件,它再次不区分大小写。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9826477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档