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