Хобрук: Ваш путь к мастерству в программировании

MySQL REGEXP не дает ожидаемых результатов (не многобайтовый безопасный?). Есть ли обходной путь?

Я пытаюсь написать запрос MySQL для определения полей имени, которые на самом деле содержат инициалы. Проблема в том, что запрос выбирает записи, которые не должны совпадать.

Я протестировал реализацию регулярного выражения POSIX ERE в RegEx Buddy, чтобы убедиться, что моя строка регулярного выражения верна, но при выполнении запроса MySQL результаты отличаются.

Например, запрос должен идентифицировать такие строки, как:

'A.J.D' or 'A J D'.

Но это также соответствует строкам, таким как «Ральф» или «Терранс».

Запрос:

SELECT *, firstname REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' FROM test_table

Поле «имя» здесь имеет значение VARCHAR 255, если это уместно.

Я получаю тот же результат при работе со строковым литералом, а не с табличными данными:

SELECT 'Ralph' REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' 

Документация MySQL предупреждает о потенциальных проблемах с REGEXP, я не уверен, связано ли это с проблемой, которую я вижу:

Предупреждение. Операторы REGEXP и RLIKE работают побайтно, поэтому они небезопасны для многобайтовых данных и могут привести к неожиданным результатам с многобайтовыми наборами символов. Кроме того, эти операторы сравнивают символы по значениям их байтов, а символы с диакритическими знаками могут не сравниваться как равные, даже если данное сопоставление рассматривает их как равные.

Заранее спасибо.

19.02.2013

  • Разве это не должно быть ... WHERE firstname REGEXP ...? 19.02.2013
  • Это всего лишь пример запроса, который показывает результат для строки в данном случае. 19.02.2013
  • Уточнение. Предупреждение о документации относится к символам, для хранения которых требуется более одного байта. Для этого требуется, чтобы вы использовали многобайтовую кодировку (например, latin1 не затрагивается) и у вас были многобайтовые символы (например, обычные английские буквы в UTF-8 не затрагиваются). 19.02.2013
  • Я вижу, спасибо за разъяснение. 19.02.2013

Ответы:


1

Если вы тестируете это в клиенте mysql, вам нужно избежать обратной косой черты. Каждое вхождение \. должно превратиться в \\. Это необходимо, потому что ваш ввод сначала обрабатывается клиентом mysql, который превращает \. в .. Поэтому вам нужно заставить его сохранять обратную косую черту, избегая их.

19.02.2013
Новые материалы

Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

Как интегрировать модель машинного обучения на ios с помощью CoreMl
С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

Создание успешной организации по науке о данных
"Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

Технологии и проблемы будущей работы
Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

Игорь Минар из Google приедет на #ReactiveConf2017
Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..