2012-03-22 69 views
2

在一些指南的幫助下,我用gcc成功編譯了sqlite3的ICU擴展,並且獲得了libSqliteIcu.so,沒有顯示任何錯誤。然後我將這個lib複製到/ usr/lib文件夾。之後,我通過終端和「.load libSqliteIcu.so」然後「icu_load_collat​​ion(」hr_HR「,」CROATIAN「);」終端上全部沒有錯誤或備註發送sqlite。「查詢結果現在已正確排序Sqlite3,c-api,icu排序規則

什麼我現在shold做的是能夠通過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錯誤:沒有這樣的排序規則序列:克羅地亞語」。

什麼我錯過了以及如何通過給定sqlite3排序propery通過c-api整理,就像我通過命令行得到的一樣?

回答

2

我找到解決方案,所以這裏就像一個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這樣搜索敏感?
我嘗試COLLATE BINARY,它又是不區分大小寫的。