如何使用指定的语言环境对sqlite3中的文本进行sorting?

默认情况下,sqlite3只能通过ASCII字母来sorting。 我试图看在谷歌,但我发现唯一的事情是关于归类的信息。 Sqlite3只有NOCASERTRIMBIARYsorting规则。 如何添加对特定区域设置的支持? (我在Rails应用程序中使用它)

SQLite 支持与ICU的集成。 根据自述文件sqlite/ext/icu/README.txtsqlite/ext/icu/目录包含SQLite“ICU”扩展的源代码,这是“国际Unicode组件”库与SQLite的集成。

 1. Features 1.1 SQL Scalars upper() and lower() 1.2 Unicode Aware LIKE Operator 1.3 ICU Collation Sequences 1.4 SQL REGEXP Operator 

我接受了Doug Currie的回答,但是我想添加一些“algorithm”,因为sqlite3文档很奇怪(至less对我来说)。

好的,我们正在使用sqlite3,现在:

  1. 下载sqlite的ICU扩展

  2. 编译它:

     gcc -shared icu.c`icu-config --ldflags` -o libSqliteIcu.so
    

    这是为Linux。 我还需要安装额外的ICU开发包:

     sudo apt-get install libicu-dev
    

    我在64位体系结构上工作,我得到__relocation R_X86_64_32S__错误(不pipe是什么意思:)。 海湾合作委员会build议添加-fPIC编译选项,它有帮助。

  3. 运行sqlite3。 我们可以用命令加载扩展:

     .load'./libSqliteIcu.so'
    

    假设它在当前目录中,我们也可以指定整个path。

  4. 创build新的sorting规则:

     SELECT icu_load_collat​​ion('pl_PL','POLISH');
    

    第一个参数是所需的语言环境,第二个参数是(可以是任何)。

  5. 现在我们可以用新的区域设置对数据进行sorting:

     SELECT * FROM some_table ORDER BY名称COLLATE POLISH;
    

    而且是不区分大小写的!

如果您不能编译ICU扩展,则可以使UDF执行相同的操作。 在PHP / PDO中:

 $pdo->sqliteCreateFunction('locale', function ($data, $locale = 'root') { static $collators = array(); if (isset($collators[$locale]) !== true) { $collators[$locale] = new \Collator($locale); } return $collators[$locale]->getSortKey($data); } ); 

用法示例:

 SELECT * FROM "table" ORDER BY locale("column", 'pt_PT'); 

我不认为这种方法和原生扩展一样有效,但它肯定更便携。