To bardzo dziwne, sam zmagałem się z tym problemem wiele razy w ciągu ostatnich 15 lat i generalnie wymyślałem struktury, które oddzielają numery kierunkowe, kody krajów i numery w oddzielnych polach itp. Ale podczas czytania twojego pytania właśnie pojawiło się inne rozwiązanie do mojej głowy, wymaga to osobnego pola, ale może nie być odpowiednie dla Ciebie.
Możesz mieć oddzielne pole o nazwie reverse_phone_number, które zostanie automatycznie wypełnione przez silnik DB, a kiedy ludzie wyszukują, po prostu odwróć ciąg wyszukiwania i użyj indeksowanego pola odwrotnego z tylko % na końcu podobnego ciągu, umożliwiając w ten sposób użycie indeks.
W zależności od silnika bazy danych możesz stworzyć indeks oparty na funkcji zdefiniowanej przez użytkownika, która robi odwrotnie, eliminując potrzebę dodatkowego pola.
W niektórych krajach m.in. w Wielkiej Brytanii, możesz mieć problem z wiodącymi zerami. Numer telefonu w Wielkiej Brytanii jest reprezentowany jako (numer kierunkowy) (numer telefonu), np. 01634 511098, gdy jest to internacjonalizacja, początkowe zero numeru kierunkowego jest usuwane, a międzynarodowy numer kierunkowy (+ lub 00) i kod kraju (44) są dodawane. Daje to międzynarodowy numer telefonu +441634511098. Żaden użytkownik wyszukujący 0163451109 nie znalazłby numeru telefonu, gdyby został on wprowadzony w formacie międzynarodowym. Możesz rozwiązać ten problem, usuwając wiodące zera z ciągu wyszukiwania.
EDYTUJ Zgodnie z sugestiami Olliego Jonesa należy zapisać numer w postaci wprowadzonej przez użytkownika, a następnie usunąć z niego wiodące zera, znaki interpunkcyjne i spacje przed odwróceniem i zapisaniem w odwróconym polu. Następnie po prostu użyj tego samego algorytmu, aby usunąć ciąg wyszukiwania przed cofnięciem, znajdź rekord, a następnie wyświetl użytkownikowi pierwotnie wprowadzoną liczbę.