MySQL / 6. Сортировка результатов запроса

Сортировка и чувствительность к регистру

Задача
Сортировка строк чувствительна к регистру тогда, когда вы этого не хотите, и наоборот.

Решение
Измените чувствительность к регистру упорядочиваемых значений.

Обсуждение
В главе 4 рассказывалось о том, что двоичные строки чувствительны к регистру, а недвоичные – не чувствительны. Это свойство переносится и на операцию сортировки строк: ORDER BY выполняет сортировку в лексическом порядке, при этом для двоичных строк операция чувствительна к регистру, а для недвоичных – не чувствительна. Рассмотрим для наглядности таблицу textblob_ val, которая содержит столбец tstr типа TEXT и столбец bstr типа BLOB:

mysql> SELECT * FROM textblob_val;

+-----+------+
| tstr  | bstr  |
+-----+------+
| aaa  | aaa  |
| AAA | AAA |
| bbb  | bbb  |
| BBB  | BBB  |
+-----+------+

Столбцы содержат одинаковые значения, но упорядочены будут по-разному, поскольку столбцы TEXT не чувствительны к регистру, а столбцы BLOB – чувствительны:

mysql> SELECT tstr FROM textblob_val ORDER BY tstr;

+-----+
| tstr  |
+-----+
| aaa  |
| AAA |
| bbb  |
| BBB  |
+-----+

mysql> SELECT bstr FROM textblob_val ORDER BY bstr;

+-----+
| bstr |
+-----+
| AAA |
| BBB  |
| aaa  |
| bbb  |
+-----+

Чтобы регулировать чувствительность к регистру инструкций ORDER BY, используем приемы, представленные в главе 4 при обсуждении аналогичного воздействия на операции сравнения строк. Чтобы выполнить чувствительное к регистру упорядочивание нечувствительных к регистру строк (в данном случае значений столбца tstr), приведите тип столбца к двоичным строкам, используя ключевое слово BINARY:

mysql> SELECT tstr FROM textblob_val ORDER BY BINARY tstr;

+-----+
| tstr  |
+-----+
| AAA |
| BBB  |
| aaa  |
| bbb  |
+-----+

Можно также преобразовать столбец вывода в двоичный и отсортировать его:

mysql> SELECT BINARY tstr FROM textblob_val ORDER BY 1;

+--------------+
| BINARY tstr |
+--------------+
| AAA             |
| BBB              |
| aaa              |
| bbb              |
+--------------+

Начиная с версии MySQL 4.0.2 можно применять специальную функцию приведения типов CAST():

mysql> SELECT tstr FROM textblob_val ORDER BY CAST(tstr AS BINARY);

+-----+
| tstr  |
+-----+
| AAA |
| BBB  |
| aaa  |
| bbb  |
+-----+

Можно сделать и все наоборот: сортировать двоичные строки без учета регистра. Для этого преобразуйте все значения к верхнему или нижнему регистру с помощью функций UPPER() или LOWER():

mysql> SELECT bstr FROM textblob_val ORDER BY UPPER(bstr);

+-----+
| bstr |
+-----+
| aaa  |
| AAA |
| bbb  |
| BBB  |
+-----+

Или можно преобразовать столбец вывода и упорядочивать его, но это может привести к нежелательным изменениям в представлении выводимых значений:

mysql> SELECT UPPER(bstr) FROM textblob_val ORDER BY 1;

+---------------+
| UPPER(bstr) |
+---------------+
| AAA              |
| AAA              |
| BBB               |
| BBB               |
+---------------+

Статьи по MySQL на эту тему:

Размещение некоторых значений в начале или конце упорядоченного списка
Сортировка IP-адресов в числовом порядке
Сортировка в порядке, определенном пользователем
Сортировка значений ENUM
Сортировка имен хостов по доменам