Spec-Zone.ru › MySQL 5.7

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

Spec-Zone.ru

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