Questo è molto strano, ho lottato con questo problema io stesso molte volte, negli ultimi 15 anni e generalmente ho escogitato strutture che separano prefissi, prefissi nazionali e numeri in campi separati ecc. Ma mentre leggevo la tua domanda è appena comparsa un'altra soluzione nella mia testa, richiede un campo separato anche se potrebbe non essere appropriato per te.
Potresti avere un campo separato chiamato reverse_phone_number, averlo popolato automaticamente dal motore DB, quindi quando le persone cercano semplicemente invertire la stringa di ricerca e utilizzare il campo inverso indicizzato con solo una % alla fine della stringa simile, consentendo così l'uso del indice.
A seconda del tuo motore DB potresti essere in grado di creare un indice basato su una funzione definita dall'utente che fa il contrario per te ovviando alla necessità di un campo aggiuntivo.
In alcuni paesi, ad es. nel Regno Unito, potresti avere un problema con gli zeri iniziali. Un numero di telefono del Regno Unito è rappresentato come (prefisso)(Numero di telefono), ad es. 01634 511098, quando questo viene internazionalizzato viene tolto lo zero iniziale del prefisso e vengono aggiunti il prefisso internazionale (+ o 00) e il prefisso internazionale (44). Ciò si traduce in un numero di telefono internazionale di +441634511098. Qualsiasi utente che cercasse 0163451109 non troverebbe il numero di telefono se fosse stato inserito in formato internazionalizzato. Puoi superare questo problema rimuovendo gli zeri iniziali dalla stringa di ricerca.
MODIFICA Sulla base dei suggerimenti di Ollie Jones, è necessario memorizzare il numero inserito dall'utente e quindi rimuovere gli zeri iniziali, la punteggiatura e gli spazi bianchi dal numero prima di invertire e memorizzare nel campo invertito. Quindi usa semplicemente lo stesso algoritmo per rimuovere la stringa di ricerca prima di invertire, trovare il record e quindi visualizzare il numero originariamente inserito all'utente.