B.3.4.1 Чувствительность к регистру в поиске строк
Для строк, не являющихся бинарными (CHAR, VARCHAR, TEXT), поиск строк использует сортировку операндов сравнения. Для бинарных строк (BINARY, VARBINARY, BLOB), сравнения используют числовые значения байтов в операндах; это означает, что для буквенных символов сравнения чувствительны к регистру.
Сравнение строки, не являющейся бинарной, и бинарной строки обрабатывается как сравнение бинарных строк.
Простые операции сравнения (>=, >, =, <,
<=, сортировка и группировка) основаны на “значении сортировки” каждого символа. Символы с одинаковым значением сортировки обрабатываются как один и тот же символ. Например, если e и é имеют одинаковое значение сортировки в данной сортировке, они сравниваются как равные.
По умолчанию наборы символов и сортировки — latin1 и latin1_swedish_ci, поэтому сравнения строк, не являющихся бинарными, по умолчанию нечувствительны к регистру. Это означает, что если вы ищете с , вы получите все значения столбцов, начинающиеся с col_name LIKE
'a%'A или a. Чтобы сделать этот поиск чувствительным к регистру, убедитесь, что один из операндов имеет сортировку, чувствительную к регистру, или бинарную сортировку. Например, если вы сравниваете столбец и строку, оба из которых имеют набор символов latin1, вы можете использовать оператор COLLATE, чтобы заставить любой операнд иметь сортировку latin1_general_cs или latin1_bin:
col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin
Если вы хотите, чтобы столбец всегда обрабатывался как чувствительный к регистру, объявите его с сортировкой, чувствительной к регистру, или бинарной сортировкой. См. Раздел 13.1.18, «Заявление CREATE TABLE».
Чтобы сравнение строк, не являющихся бинарными, чувствительных к регистру, было нечувствительным к регистру, используйте COLLATE для указания сортировки, нечувствительной к регистру. В следующем примере строки обычно чувствительны к регистру, но COLLATE меняет сравнение на нечувствительное к регистру:
mysql> SET @s1 = 'MySQL' COLLATE latin1_bin,
-> @s2 = 'mysql' COLLATE latin1_bin;
mysql> SELECT @s1 = @s2;
+-----------+
| @s1 = @s2 |
+-----------+
| 0 |
+-----------+
mysql> SELECT @s1 COLLATE latin1_swedish_ci = @s2;
+-------------------------------------+
| @s1 COLLATE latin1_swedish_ci = @s2 |
+-------------------------------------+
| 1 |
+-------------------------------------+
Бинарная строка чувствительна к регистру в сравнениях. Чтобы сравнить строку как нечувствительную к регистру, преобразуйте её в строку, не являющуюся бинарной, и используйте COLLATE для указания сортировки, нечувствительной к регистру:
mysql> SET @s = BINARY 'MySQL';
mysql> SELECT @s = 'mysql';
+--------------+
| @s = 'mysql' |
+--------------+
| 0 |
+--------------+
mysql> SELECT CONVERT(@s USING latin1) COLLATE latin1_swedish_ci = 'mysql';
+--------------------------------------------------------------+
| CONVERT(@s USING latin1) COLLATE latin1_swedish_ci = 'mysql' |
+--------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------+
Чтобы определить, сравнивается ли значение как строка, не являющаяся бинарной, или бинарная строка, используйте функцию COLLATION(). Этот пример показывает, что VERSION() возвращает строку с сортировкой, нечувствительной к регистру, поэтому сравнения нечувствительны к регистру:
mysql> SELECT COLLATION(VERSION());
+----------------------+
| COLLATION(VERSION()) |
+----------------------+
| utf8_general_ci |
+----------------------+
Для бинарных строк значение сортировки — binary, поэтому сравнения чувствительны к регистру. Один контекст, в котором вы можете увидеть binary, — это функции сжатия, которые как правило возвращают бинарные строки:
mysql> SELECT COLLATION(COMPRESS('x'));
+--------------------------+
| COLLATION(COMPRESS('x')) |
+--------------------------+
| binary |
+--------------------------+
Для проверки значения сортировки строки может быть полезна функция WEIGHT_STRING(). См. Раздел 12.8, «Функции и операторы строк».
© 2025 Oracle
Licensed under the GPLv2 License.