Функции сравнения строк
Обычно если при выполнении сравнения строк одно из выражений является зависимым от регистра, то сравнение выполняется также с учетом регистра.
expr LIKE pat [ESCAPE 'escape-char']
Функция производит сравнение с шаблоном, используя операции сравнения простых регулярных выражений в SQL. Возвращает 1 (ИСТИНА) или 0 (ЛОЖЬ). Выражение LIKE предусматривает использование следующих двух шаблонных символов в pat :
Символ | Описание | % | Соответствует любому количеству символов, даже нулевых | _ | Соответствует ровно одному символу |
mysql> SELECT 'David!' LIKE 'David_'; -> 1
mysql> SELECT 'David!' LIKE '%D%v%'; -> 1
Если требуется исследовать литералы при помощи шаблонного символа, следует предварить шаблонный символ экранирующим символом. Если экранирующий символ конкретно не указывается, то подразумевается применение символа '\':
Строка | Описание | \% | Соответствует одному символу '%' | \_ | Соответствует одному символу '_' |
mysql> SELECT 'David!' LIKE 'David\_'; -> 0
mysql> SELECT 'David_' LIKE 'David\_'; -> 1
Для указания конкретного экранирующего символа используется выражение ESCAPE :
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1
В следующих двух примерах показано, что сравнение строк производится с учетом регистра, если ни один из операндов не является строкой с двоичными данными:
mysql> SELECT 'abc' LIKE 'ABC'; -> 1 mysql> SELECT 'abc' LIKE BINARY 'ABC'; -> 0
В функции LIKE допускаются даже числовые выражения! (Это расширение MySQL по сравнению с ANSI SQL LIKE.)
mysql> SELECT 10 LIKE '1%'; -> 1
Примечание: поскольку в MySQL применяются правила экранирования в строках, применяемые в языке C (например, '\n'), необходимо дублировать все символы '\', используемые в строках функции LIKE . Например, для поиска сочетания символов '\n' его необходимо указать как '\\n'. Чтобы выполнить поиск символа '\', он должен быть указан как '\\\\' (обратные слеши удаляются дважды: сначала синтаксическим анализатором, а потом - при выполнении сравнения с шаблоном, таким образом остается только один обратный слеш, который и будет обрабатываться).
expr NOT LIKE pat [ESCAPE 'escape-char']
То же, что и NOT (expr LIKE pat [ESCAPE 'escape-char']) .
expr REGEXP pat
expr RLIKE pat
Выполняет сравнение строкового выражения expr с шаблоном pat . Шаблон может представлять собой расширенное регулярное выражение. См. раздел Регулярные выражения в MySQL. Возвращает 1 , если expr соответствует pat , в противном случае - 0 . Функция RLIKE является синонимом для REGEXP , она предусмотрена для совместимости с mSQL. Примечание: поскольку в MySQL используются правила экранирования в строках, применяемые в языке C (например, '\n'), необходимо дублировать все символы '\', используемые в строках функции REGEXP . Что касается версии MySQL 3.23.4, функция REGEXP является независимой от регистра для нормальных строк (т.е. строк не с двоичными данными):
mysql> SELECT 'Monty!' REGEXP 'm%y%%'; -> 0
mysql> SELECT 'Monty!' REGEXP '.*'; -> 1
mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; -> 1
mysql> SELECT "a" REGEXP "A", "a" REGEXP BINARY "A"; -> 1 0
mysql> SELECT "a" REGEXP "^[a-d]"; -> 1
В REGEXP и RLIKE используется текущий набор символов (ISO-8859-1 Latin1 по умолчанию),
expr NOT REGEXP pat
expr NOT RLIKE pat
То же, что и NOT (expr REGEXP pat) .
STRCMP(expr1,expr2)
Функция STRCMP() возвращает: 0 , если строки идентичны, -1 - если первый аргумент меньше второго (в соответствии с имеющимся порядком сортировки), и 1 - в остальных случаях:
mysql> SELECT STRCMP('text', 'text2'); -> -1
mysql> SELECT STRCMP('text2', 'text'); -> 1
mysql> SELECT STRCMP('text', 'text'); -> 0
MATCH (col1,col2,...) AGAINST (expr)
MATCH (col1,col2,...) AGAINST (expr IN BOOLEAN MODE)
Функция MATCH ... AGAINST() используется для полнотекстового поиска и возвращает величину релевантности - степень сходства между текстом в столбцах (col1,col2,...) и запросом expr . Величина релевантности представляет собой положительное число с плавающей точкой. Нулевая релевантность означает отсутствие сходства. Функция MATCH ... AGAINST() работает в версиях MySQL 3.23.23 или более поздних. Расширение IN BOOLEAN MODE было добавлено в версии 4.0.1. Более подробное описание и примеры использования приведены в разделе Полнотекстовый поиск в MySQL.
Чувствительность к регистру
По умолчанию поиск в MySQL является независимым от регистра символов (хотя существуют некоторые кодировки, которые всегда чувствительны к регистру, такие как czech ). Это означает, что при поиске с помощью col_name LIKE 'a%' будут выданы все значения столбца, начинающиеся на A или a. Если необходимо выполнить тот же поиск с учетом регистра, для проверки префикса следует использовать что-то вроде INSTR(col_name, "A")=1 или STRCMP(col_name, "A") = 0 , если значение в столбце точно равно A .
Простые операции сравнения (>=, >, =, <, <= , сортировка и группировка) основываются на "сорте" каждого символа. Символы одного сорта (такие как E , e и E ) обрабатываются как одинаковые символы!
В старых версиях MySQL сравнения по LIKE выполнялись над символами, переведенными в верхний регистр (E == e , но E <> E ). В новых версиях MySQL LIKE работает точно так же, как другие операторы сравнения.
Если необходимо, чтобы столбец всегда обрабатывался в с учетом регистра, объявите его с типом BINARY (см. раздел Синтаксис оператора CREATE TABLE ).
Если вы используете китайские данные в так называемой кодировке big5 , то имеет смысл объявить все символьные столбцы как BINARY . Сортировка таких столбцов будет работать, поскольку порядок сортировки символов в кодировке big5 основывается на порядке кодов ASCII .
1 2 3 4 5 6
8 8 8
| |