В современных информационных системах часто возникает задача извлечь из массива данных только те записи, которые содержат русские символы. Это может понадобиться при работе с телефонными номерами, адресами, названиями организаций и т.д. В данной статье мы рассмотрим практический пример – выделение всех номеров, относящихся к городу Борзя (Забайкальский край), а также общие методы фильтрации русских символов в SQL‑запросах, использовании регулярных выражений и настройке поисковых систем.
Кратко о городе Борзя и его телефонной нумерации
Борзя – town в Забайкальском крае России. Телефонные номера этого региона начинаются с кода +7 -0241 (или 8 30241 при внутригородском наборе). Пример полного номера:
- +7 -0241 2‑12‑34
- 8 30241 5‑56‑78
Если в базе данных хранятся номера самых разных регионов, то для выделения именно «борзянской» части достаточно отфильтровать записи по префиксу 30241. Однако часто требуется не только проверять числовой префикс, но и убедиться, что accompanying текстовые поля (например, комментарии, названия контрагентов) содержат русские буквы. Ниже описаны способы такой фильтрации.
Почему обычный LIKE может не работать с русскими символами
Многие разработчики сталкиваются с тем, что запрос вида
SELECT * FROM table WHERE column LIKE '%А%';
возвращает не только русскую букву «А», но и латинскую «A», либо вовсе не находит нужные записи. Причина – в используемой коллации и в том, что диапазон A‑Z в шаблоне LIKE охватывает только латинские символы.
Для корректной работы необходимо явно указать диапазон Unicode‑кодов русских букв или воспользоваться подходящей коллацией.
Выделение русских символов: диапазоны Unicode
Кириллица в Unicode расположена в блоках:
- Основная кириллица: U+0400 – U+04FF
- Кириллица‑дополнение: U+0500 – U+052F
Следовательно, диапазон русских букв (включая Ё/ё) можно описать как:
- U+0401 (Ё) и U+0451 (ё)
- U+0410–U+042F (А‑Я)
- U+0430–U+044F (а‑я)
В SQL‑диалектах, поддерживающих регулярные выражения (например, MySQL 8.0+, PostgreSQL, Oracle), можно использовать такой шаблон:
WHERE column REGEXP '[ЁёА-Яа-я]'
Если REGEXP недоступен, многие СУБД позволяют сравнивать по коду символа:
WHERE UNICODE(SUBSTRING(column, n, 1)) BETWEEN 1040 AND 1103 -- А‑Я и а‑я OR UNICODE(SUBSTRING(column, n, 1)) IN (1025, 1105) -- Ё, ё
Примеры запросов для выделения «борзянской» части номеров
MySQL (с REGEXP)
SELECT * FROM phone_numbers WHERE number LIKE '+7 -0241%' -- числовой префикс Борзя AND comment REGEXP '[ЁёА-Яа-я]'; -- наличие хотя бы одного русского символа в комментарии
PostgreSQL (с SIMILAR TO или ~)
SELECT * FROM phone_numbers WHERE number LIKE '+7 -0241%' AND comment ~ '[ЁёА-Яа-я]';
SQL Server (с использованием COLLATE и PATINDEX)
SELECT *
FROM phone_numbers
WHERE number LIKE '+7 -0241%'
AND PATINDEX('%[ЁёА-Яа-я]%' COLLATE Cyrillic_General_CS_AS, comment) > 0;
Oracle (с REGEXP_LIKE)
SELECT * FROM phone_numbers WHERE number LIKE '+7 -0241%' AND REGEXP_LIKE(comment, '[ЁёА-Яа-я]');
Во всех примерах первым условием отбирается нужный телефонный префикс, а вторым – наличие русского символа в произвольном текстовом поле (комментарий, ФИО и т.д.). Это позволяет получить именно «борзянскую часть всех номеров», сопровождаемую русскоязычной информацией.
Альтернативные подходы: использование WeTransfer
Помимо работы с базами данных
Если в базе хранится большое количество записей, полезно создать индекс по выражению, которое проверяет наличие кириллицы. Например, в PostgreSQL можно использовать функциональный индекс:
CREATE INDEX idx_phone_comment_cyrillic ON phone_numbers ((comment ~ '[ЁёА-Яа-я]'));
Такой индекс ускорит фильтрацию без полного сканирования таблицы.
Рекомендации по работе с поисковыми системами и фильтрацией контента
Если задача состоит в том, чтобы исключить русскоязычные результаты из поиска (или, наоборот, оставить только их), полезно знать следующие приёмы:
- В Google можно добавить параметр
lr=lang_ruдля ограничения результатов русскоязычными страницами. - Для исключения русского контента используют
-lang:ruили указывают регион, где русский язык не predominates. - В Яндексе аналогично работает параметр
&lr=213(русский язык) и исключение через минус.
Эти техники полезны, когда необходимо анализировать только англоязычные источники, как показано в фрагменте из предоставленного интернет‑контента.
Выделение «борзянской части всех номеров» – это комбинация двух простых условий:
- Фильтрация по телефонному префиксу +7 -0241 (или код региона
- Проверка наличия русских символов) сопутствующих полный номер начинается с +7 -0241;
- Убедиться, что связанные текстовые поля содержат хотя бы один русский символ, используя диапазоны Unicode, регулярные выражения или подходящую коллацию.
Применяя представленные примеры запросов и рекомендации по индексации, вы сможете эффективно извлекать нужные данные из любой реляционной базы данных, а также корректно настраивать поисковые системы для работы с русскоязычным контентом.
Помните: правильный выбор колляции и использование Unicode‑диапазонов гарантируют, что ваш запрос будет работать независимо от настроек сервера и не будет «пропускать» латинские аналоги кириллических букв.