MySQL的order by時區分大小寫

原文鏈接: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有過詳細的介紹, 我們就不在這裏去介紹它了。

如何解決

解決方案有兩個:

  1. 將test_collate表的collate改成case sensitive的

  2. 使用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 |+----+------+


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章