Задача
Сортировка строк чувствительна к регистру тогда, когда вы этого не хотите, и наоборот.
Решение
Измените чувствительность к регистру упорядочиваемых значений.
Обсуждение
В главе 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 |
+---------------+