COLLATE LOCALIZED ASC代表什么意思?

30
private Cursor getContacts() {
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME
    };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
            (mShowInvisible ? "0" : "1") + "'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +
            " COLLATE LOCALIZED ASC";

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}

COLLATE LOCALIZED ASC是什么意思?

3个回答

30

整理(Collate)其实就是排序的高端说法(差不多就是这个意思)。所以这是基于本地化偏好(即当前语言的字母表和惯例)的升序排序。


我需要在表模式中定义其他内容才能使用它吗?这是SQLite特定的还是仅适用于Android?我可以按所有自定义列排序吗? - Pentium10
ASC表示升序。它与ASCII没有任何关系。 - Steve Waring

22

这条指令告诉SQLite按适当的顺序排序非ASCII字符。 带有变音符号(有人称之为重音符号)的字符具有比字符Z更高的字节代码,因此普通的ASCII排序不适用于许多外语。

例如,大写字母A的字节代码是0x41,大写字母Z的字节代码是0x5A。 然后我们有Á(大写字母A加重音符),其在Unicode中的代码为0x00C1。 因此,简单的字节代码排序将导致Á在Z之后。

但是,在具有此类字符的语言中,惯例是将带有变音符号的字符放置在它们似乎没有变音符号的位置。 因此,Á应该与普通A一起,至少在B之前。

为了说明,下面是一个使用它们的字节代码排序的名称列表:

  • Brenda
  • Debby
  • George
  • Álvaro
  • Érico

现在使用COLLATE LOCALIZED将按字符的“基本部分”进行排序:

  • Álvaro
  • Brenda
  • Debby
  • Érico
  • George

3
这应该是最受欢迎的,有很好的解释和例子。 - Lavekush Agrawal
如果我输入A,使用COLLATE LOCALIZED,它只会显示Álvaro吗? - Star
@Start 不是因为在排序表达式中使用了 COLLATE LOCALIZED。 - eric

12

COLLATE 是一种 SQL 运算符,可以让您覆盖字符串的默认排序顺序。例如,“COLLATE NOCASE” 进行不区分大小写的比较,“COLLATE BINARY” 则进行区分大小写的比较。

SQLite C 接口允许您定义自定义排序规则 (http://www.sqlite.org/c3ref/create_collation.html)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接