原文鏈接:https://github.com/lexdene/md-blog/blob/master/mysql/order_by_case_sensitive.md
======================================
MySQL的order by時區分大小寫
MySQL默認的order by是不區分大小寫的。 如果我們希望使用區分大小寫的order by, 該怎麼辦呢?
先看一個例子。
表結構:
create table test_collate( `id` int NOT NULL AUTO_INCREMENT, `text` varchar(40) NOT NULL, PRIMARY KEY (`id`))ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入數據:
insert into test_collate(`text`) values('aaa'),('bbb'),('AAA'),('BBB');
現在,如果我們按照text排序:
select * from test_collate order by text;
結果:
+----+------+| id | text |+----+------+| 1 | aaa || 3 | AAA || 2 | bbb || 4 | BBB |+----+------+
結果表明,大寫的AAA和小寫的aaa被認爲是一樣的, 都排在BBB和bbb前面。
爲什麼呢?
這裏涉及到一個重要的概念,叫collate。 collate是一個與charset有關的概念, 它會影響到很多事情, 其中就包括排序的規則。
在《MySQL必知必會》中對collate有過詳細的介紹, 我們就不在這裏去介紹它了。
如何解決
解決方案有兩個:
將test_collate表的collate改成case sensitive的
使用case sensitive的collate進行order by
這裏,我們不希望改變表結構, 只是臨時地order by一下, 因爲使用方案2。
代碼如下:
select * from test_collate order by text collate utf8_bin;
結果如下:
+----+------+| id | text |+----+------+| 3 | AAA || 4 | BBB || 1 | aaa || 2 | bbb |+----+------+