排序 MySQL 忽略大小写的查询

Sorting a MySQL Query ignoring case

你马上就会想,"use ORDER BY and then the column" 但我的价值观是:

  1. 一个
  2. Z
  3. 一个
  4. z

当我使用此查询对它们进行排序时:

SELECT * FROM Diaries ORDER BY title ASC;

然后我明白了:

  1. 一个
  2. Z
  3. 一个
  4. z

当我想得到这样的东西时,第一期:

  1. 一个
  2. 一个
  3. Z
  4. z

我在其他地方遇到了同样的排序问题,第二期,但我能够用这个解决它:通过暂时将所有字符设为小写

for (NSString *key in [dicGroupedStories allKeys]) {
    [dicGroupedStories setValue: [[dicGroupedStories objectForKey: key] sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        NSString *stringA = [[a objectStory_title] lowercaseString];
        NSString *stringB = [[b objectStory_title] lowercaseString];

        return [stringA compare: stringB];
    }] forKey: key];

}

我不使用此比较器对我的 第一期 进行排序的唯一原因是因为我不想执行我的查询然后对它们进行排序然后使用数组。

问题:我想知道是否有办法按照我想要的方式对它们进行排序,就像我在第二期中所做的那样,在 SQL 查询中

objects id a and id b are arrays that contain other objects like title, date created, description, etc. objectDiary_title returns a NSString

在SQL中,您可以在order by:

中使用lower()upper()函数
ORDER BY lower(Diaries), diaries

您可以将 COLLATE 与 xxx_ci 一起使用,其中 ci 表示不区分大小写。例如:

SELECT * FROM Diaries ORDER BY title COLLATE 'latin1_general_ci' ASC;

此处 MySQL 中有关于区分大小写的更多信息:https://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html。它对于进行搜索和比较也很有用。

使用不区分大小写的collation,例如:

ORDER BY Diaries COLLATE utf8_unicode_ci ;

但是,像任何 一样,即时更改排序规则会使查询无法使用索引(如果要排序的数据集足够小,这是可以接受的)。

如果性能有问题,那么您最好使用目标排序规则重新索引该列:

ALTER TABLE MODIFY COLUMN Diaries VARCHAR(10) COLLATE utf8_unicode_ci ;

ORDR BY 将默认不区分大小写,并且可以在此列上使用索引。

utf8_unicode_ci 只是一个例子。只需确保使用排序规则 *_ci(不区分大小写)即 compatible with the column's encoding