Я пытаюсь написать запрос 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 работают побайтно, поэтому они небезопасны для многобайтовых данных и могут привести к неожиданным результатам с многобайтовыми наборами символов. Кроме того, эти операторы сравнивают символы по значениям их байтов, а символы с диакритическими знаками могут не сравниваться как равные, даже если данное сопоставление рассматривает их как равные.
Заранее спасибо.