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

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

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

Обсуждение
В главе 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 |
+---------------+

Оцените статью: (0 голосов)
0 5 0

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