Rolf B: Unterschiedlich Formatierte Telefonnummern abgleichen

Beitrag lesen

Hallo LastBoyScout,

es ist häufig üblich, Telefonnummern in Datenbanken so zu speichern, dass ein Mensch ihnen ansehen kann was Ländervorwahl, Ortsnetz-Vorwahl, Ortsrufnummer und ggf. Anlagendurchwahl ist. Für eine Suche ist das völlig tödlich.

Ein Splitten dieser Nummernteile, so dass man sie getrennt speichern kann, macht die Sache nicht wirklich besser; es sei denn, du kannst die Eingabe in der Suche beeinflussen. Wenn der Suchstring einfach nur ein String ist, dann müsstest Du ihn in seine Bestandteile zerlegen um an Hand der Nummernteile in der DB suchen zu können.

Was Du keinesfalls tun solltest, ist ein SQL Statement zu bauen, dass während der Suche die Telefonnummer in der DB analysiert. Solche SQLs führen zu einem Table-Scan und sind extrem unperformant. Bei 100 Sätzen merkst Du es nicht, bei 1000000 Sätzen geht die DB in die Knie.

Meine Empfehlung wäre ein zweites Feld in der Datenbank, das indexiert ist. Das setzt natürlich voraus, das irgendwer dieses Feld pflegt. Entweder ein Batch-Job (CRON-Job), ein DB-Trigger oder die Datenpflege-Anwendung. Dieses Suchfeld enthält die Telefonnummer im internationalen Format, ohne jede Lesbarkeitshilfen. (0221)17940-100 würdest Du darin also als 4922117940100 speichern.

Aus Suchstrings entfernst Du vor der Suche die Lesbarkeitshilfen. Sodann musst Du wissen, ob deine Anwender alle deutsch sind, sonst kannst Du ihre Eingaben nicht normieren. Hast Du mehrere Eingabeländer, brauchst Du für jedes Land eine passende Eingabenormierung. Wenn jemand in Deutschland 022117940100 sucht, ist das der Kölner Dom. In der Schweiz landest Du damit irgendwo in Genf, in Österreich nirgends. Eine deutsche Eingabenormierung sieht so aus: Beginnt die Nummer mit + oder 00, ist sie international und du musst nur das + bzw. das 00 entfernen. Beginnt sie mit einer 0, ist sie national und du musst die 0 durch 49 ersetzen. Beginnst sie NICHT mit einer 0, ist es eine Ortsnetzrufnummer und du hast entweder Kontextinformationen, in welchem Ortsnetz der Anrufer sitzt, oder musst die Eingabe abweisen. Die Normierung für Österreich ist ähnlich, nur mit anderer Landesvorwahl. In der Schweiz gibt's gar keine Vorwahl. In Italien wird die führende 0 nicht mehr entfernt, und eine Nummer ohne führende 0 ist erlaubt (Mobilnummer). Und so weiter und so weiter. Je Land anders und jederzeit änderbar.

Mit der so normierten Nummer kannst Du dann im Telefonindex-Feld suchen.

Rolf

--
sumpsi - posui - clusi