Esto es muy extraño, yo mismo he luchado con este problema muchas veces, durante los últimos 15 años y, en general, se me ocurren estructuras que separan los códigos de área, los códigos de país y el número en campos separados, etc. Pero mientras leía su pregunta, apareció otra solución en mi cabeza, requiere un campo separado, aunque puede que no sea apropiado para ti.
Podría tener un campo separado llamado número_de_teléfono_inverso, hacer que el motor de la base de datos lo complete automáticamente y luego, cuando las personas busquen, simplemente invierta la cadena de búsqueda y use el campo inverso indexado con solo un % al final de la cadena similar, lo que permite el uso de la índice.
Dependiendo de su motor de base de datos, es posible que pueda crear un índice basado en una función definida por el usuario que haga lo contrario por usted, obviando la necesidad de un campo adicional.
En algunos países, p. el Reino Unido, es posible que tenga un problema con los ceros iniciales. Un número de teléfono del Reino Unido se representa como (código de área)(Número de teléfono), p. 01634 511098, cuando este se internacionaliza se elimina el cero inicial del código de área y se agrega el código de marcación internacional (+ o 00) y el código de país (44). Esto da como resultado un número de teléfono internacional de +441634511098. Cualquier usuario que busque 0163451109 no encontrará el número de teléfono si se ingresa en formato internacionalizado. Puede solucionar este problema eliminando los ceros iniciales de la cadena de búsqueda.
EDITAR Según las sugerencias de Ollie Jones, debe almacenar el número tal como lo ingresó el usuario y luego eliminar los ceros iniciales, la puntuación y los espacios en blanco del número antes de invertirlo y almacenarlo en el campo invertido. Luego, simplemente use el mismo algoritmo para eliminar la cadena de búsqueda antes de invertirla, busque el registro y luego muestre el número ingresado originalmente al usuario.