Это очень странно, я сам много раз боролся с этой проблемой за последние 15 лет и обычно придумывал структуры, которые разделяют коды городов, коды стран и номера на отдельные поля и т. Д. Но, читая ваш вопрос, другой Решение только что появилось в моей голове, оно требует отдельного поля, хотя может не подойти вам.
Вы могли бы иметь отдельное поле с именем reverse_phone_number, чтобы оно автоматически заполнялось механизмом БД, тогда, когда люди будут искать просто перевернуть строку поиска и использовать индексированное обратное поле только с% в конце одинаковой строки, что позволяет использование индекса.
В зависимости от вашего механизма БД вы можете создать индекс на основе пользовательской функции, которая сделает все наоборот, устраняя необходимость в дополнительном поле.
В некоторых странах, например В Великобритании у вас могут возникнуть проблемы с ведущими нулями. Номер телефона в Великобритании представлен как (код города) (номер телефона), например, 01634 511098, когда это интернационализировано, ведущий ноль кода города удаляется и добавляются международный код набора (+ или 00) и код страны (44). Это приводит к международному номеру телефона +441634511098. Любой пользователь, выполняющий поиск 0163451109, не найдет номер телефона, если он будет введен в интернационализированном формате. Вы можете решить эту проблему, удалив начальные нули из строки поиска.
EDIT
Основываясь на предложениях Олли Джонса, вы должны сохранить число, введенное пользователем, а затем убрать начальные нули, знаки пунктуации и пробелы из числа перед тем, как обратить и сохранить в обратном поле. Затем просто используйте тот же алгоритм, чтобы убрать строку поиска перед реверсом, найти запись и затем отобразить первоначально введенный номер обратно пользователю.