如何忽略CI中的order子句中的小写和大写?

时间:2012-11-27 20:36:58

标签: php codeigniter

我有这个函数从数据库中获取用户:

function get_users_limited($offset, $limit)
{
    $q = $this->db->select('*')
              ->from('users')
              ->join('user_profiles', 'user_profiles.user_id = users.id'  )
              ->order_by('users.username asc')
              ->limit($limit, $offset)
              ->get();
    return $q;
}

我想按用户名asc订购结果,但问题是A和A以及B和B等之间存在差异。

问题是结果如下:

Albert
Bob
Caesar
axnGuy
blackboy83
c3p0

我想要这个:

Albert
axnGuy
Bob
blackboy83
Caesar
c3p0

如何在CodeIgniter中使用小写和大写的任何建议?

我需要CI特定解决方案!

2 个答案:

答案 0 :(得分:1)

我不熟悉你的php,你没有指定你正在使用的字符集。此外,它没有特别提及,但我想我们在这里谈论MySQL。

假设MySQL,假设您正在使用utf8的字符集。

您可以在选择中选择不同的排序规则(对utf8有效),例如

SELECT `name` COLLATE utf8_unicode_ci as `name` FROM `owners`;

这里的表是utf8字符集,我在name列上使用utf8_unicode_ci(ci表示不区分大小写)整理模式。

如果您使用的是latin1的默认字符集,则可以执行以下操作:

SELECT `name` COLLATE latin1_general_ci as `name` FROM `owners`;

完全不熟悉您的PHP,但我认为它看起来像这样:

function get_users_limited($offset, $limit)
{
    $q = $this->db->select('users.username COLLATE latin1_general_ci as c1, user_profiles.* ')
              ->from('users')
              ->join('user_profiles', 'user_profiles.user_id = users.id'  )
              ->order_by('c1 asc')
              ->limit($limit, $offset)
              ->get();
    return $q;
}

指定charset的排序规则子集不会设置或更改该列/表上的默认排序规则。

答案 1 :(得分:0)

这与数据库的整理有关。将其更改为某些_ci变体(不区分大小写)并尝试相同的查询。