Spec-Zone.ru › MySQL 9.2

B.3.4.1 Регистрозависимость при поиске строк

Для строк, не являющихся двоичными (CHAR, VARCHAR, TEXT), поиск строк использует правила сортировки (collation) операторов сравнения. Для двоичных строк (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.21, «Заявление 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   |
+----------------------+

Для двоичных строк значение сортировки (collation) равно 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-9.2-en/case-sensitivity.html

Spec-Zone.ru

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