Moin!
Problem 1:
Solch ein vertipper wird aber auf der Site http://itouchmap.com/latlong.html korrigiert, d.h. wenn man dort "Wermar" eingibt, dann wird auch trotzdem "Weimar" gefunden.
Kann man so etwas (natürlich auch für andere Fälle bzw. andere Orte) per PHP-Skript lösen, dass auch Vertipper zum richtigen Ziel weiterleiten - als Lösung hätte ich nämlich daran gedacht, alle Vertipper extra in der Datenbank abzuspreichern, aber das wäre ja ein Riesen-Aufwand...
Die direkte Antwort auf deine Frage lautet: Ja, kann man.
Und die Umsetzung gibts entweder in datenaufwendig und performant, oder in datensparsam, aber unperformant.
Datenaufwendig wäre die Version, alle Tippfehler in einer Index-Tabelle ihren korrekten Worten zuzuweisen. Wenn man die Menge der vertippbaren Zeichen einschränkt, beispielsweise sich auch am möglichen Tastaturlayout orientiert, lässt sich auf diese Weise auch automatisch generieren, was Menschen so eintippen könnten.
In Performanceaufwendig ist die Version, mit der Funktion levenshtein() (sieht wie ein Tippfehler aus, aber der Mensch hieß halt so) die minimale Anzahl an notwendigen Zeichenveränderungen zu berechnen, um vom Suchwort zum möglichen Treffer zu gelangen. Das ist allerdings aufwendig, weil das Suchwort mit jedem Datenbankeintrag verglichen werden muss.
Außerdem existiert im normalen MySQL keine derartige Funktion. Man kann sich sowas nachrüsten (http://www.teamarbyte.de/levenshtein.html) (laut Beschreibung sorgt der dritte Parameter als maximale Levenshtein-Distanz für Performanz), die Alternative wäre eine Implementierung in PHP (http://de2.php.net/levenshtein), die aber extrem unperformant laufen dürfte. Für jedes Suchwort muss ja immer die gesamte Tabelle abgefragt, ausgelesen und verglichen werden, es lässt sich nichts vorberechnen.
Problem 2:
wie mache ich das ganze mit Umlauten, d.h. in meiner Datenbank steht als Ort "München" - allerdings bei der Suche nach "Muenchen" oder gar in Großbuchstaben "MÜNCHEN" gibt es keinen Erfolg - muss ich da mit eregi_replace arbeiten, wenn ich den Suchstring per PHP übergebe und mit den Inhalten der Datenbank vergleiche?
Die Kollation der jeweiligen Spalte ist entscheidend für die "Gleichheit" bei Abfragen in der Datenbank. Alle Kollationen mit "_ci" vergleichen ohne Berücksichtigung von Groß/Kleinschreibung. Und je nach Kollation gibt es für die deutschen Umlaute unterschiedliche Gleichheitsbedingungen:
latin1_german1_ci und utf8_unicode_ci behandeln "ü" wie "u".
latin1_german2_ci behandelt "ü" wie "ue".
Lies dazu am Besten das Handbuch: http://dev.mysql.com/doc/refman/5.0/en/charset-collation-effect.html
- Sven Rautenberg