Spec-Zone.ru › MySQL 8.4

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/case-sensitivity.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API