[mySQL] Ersatz für SELECT REPLACE

syntec

Lt. Commander
Registriert
Mai 2005
Beiträge
1.057
Das Beispiel in der Doku zeigt:

PHP:
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com

Leider geht das nur mit einem String der getauscht werden soll, ich bräuchte aber eine Funktion die Leerzeichen und deutsche Sonderzeichen in einem Rutsch umwandelt.

Das habe ich in der Anleitung leider unter
http://dev.mysql.com/doc/refman/5.1/de/string-functions.html
leidernicht gefunden.

Beispiel:
Peter Hälfer muss zu "peterhaelfer" werden.

Bisher bekomme ich es nur hin das Leerezeichen zu entfernen und den String Lower auszugeben.
 
Warum nicht, du kannst das Ding auch schachteln, sprich zb.


REPLACE(REPLACE(REPLACE(LOWER('www.mysql.com'), 'ä', 'ae'), 'ö', 'oe'), 'ü', 'ue');


usw. usf. ^^

Das replace kannste sogar im Order by oder update set = replace(blaba) verwenden

Achso und statt 'www.mysql.com' kann man natürlich auch eine Tabellenspalte nehmen, dann ohne Hochkomma. Ist ja nur nen Beispiel.
 
Zuletzt bearbeitet:
Mhm, verschachtelt ist mir irgendwie zu Bandwurmig :)

Hatte ich vorhin schon probiert, aber leider hat es irgendwie nicht funktioniert als ich das Testweise mal um ein u > ue probiert hatte.

PHP:
SELECT id FROM table WHERE REPLACE(REPLACE(LOWER(name),' ',''),'ue','ü') = '".$_GET['name']."' LIMIT 0,1";

Was eleganteres gibts nicht?
 
Hmm also ich sehe jetzt auf die schnelle keine Fehler im Syntax.
Was kommt denn für ne Fehlermeldung?

Allerdings kann es auch sein, dass die Daten diese Umwandlung garnicht benötigen und somit eh nix gefunden wird. ^^
Ich weiss ja jetzt nicht in welcher Form genau die Daten in der Tabelle vorliegen?
Und Limit 0, 1 gibt nur 1 DS zurück. Da kannste Dir die 0 auch sparen. ;)

Es gehen auch noch REGEXP, aber etwas knifflig und nicht ganz so easy.
 
Relict schrieb:
Hmm also ich sehe jetzt auf die schnelle keine Fehler im Syntax.
Was kommt denn für ne Fehlermeldung?

Keine, es wird nur kein Datensatz gefunden.

Allerdings kann es auch sein, dass die Daten diese Umwandlung garnicht benötigen und somit eh nix gefunden wird. ^^

Doch, doch - alle anderen Datensätze ohne Umlauten klappen weiterhin. Deshalb war ich ja auch etwas verunsichert ob es mit dem Verschachteln klappt oder nicht.

Es gehen auch noch REGEXP, aber etwas knifflig und nicht ganz so easy

Regular Expressions - damit hab ich heut schon in der .htaccess gekämpft :D
 
So also ich habs jetzt mal testweise in meiner MYSQL 4 probiert und es funzt einwandfrei.

In Spalte de steht 'nächste Seite'

SELECT * FROM lang WHERE REPLACE(REPLACE(LOWER(de),' ',''),'ä','ae') = 'naechsteseite'

Eventuell bringt es ein LIKE '%blabla%' statt ein =
Weiss ja net was noch so für Zeichen und Text in dieser Spalte bei Dir steht.

Es kann also eigentlich bei Dir nur am nichtstimmigen Vergleich liegen ,dass er logischerweise nix findet.
Weil das Replace wird in jedem Fall ausgeführt, egal was in deinem GET[name] steht.
Wenn dort natürlich wieder nen Umlaut oder Leerzeichen oder gross-klein steht, kanns nie passen. ;)


An dem Limit liegts auch nicht? Hast Du es schonmal ganz weggelassen?

Eventuell liegt es auch am voreingestellten Zeichensatz der Tabelle/ DB?
MYSQL 5 hat ja da so seine Problemchen. ^^

Edit:

Oder probiers testweise mal ganz auf die harte Tour, indem Du auch das get[name] sicherheitshalber etwas vorformatierst ;)

zb. so ungefähr

SELECT * FROM lang WHERE REPLACE(REPLACE(LOWER(de),' ',''),'ä','ae') = REPLACE(REPLACE(LOWER('".$_GET['name']."'),' ',''),'ä','ae')
 
Zuletzt bearbeitet:
In der Tabelle stehen sind mehr als 30 Felder, micht interessiert aber nur
der Name:

z.B. "Stadt Osnabrück" oder "Stadt Karlsruhe"

Sobald ein Umlaut im Namen ist, findet er aber einfach kein Ergbenis mehr, hab das jetzt schon ewig mit phpmyadmin durchgetestet, also es liegt weder an der GET-Var noch am Limit - von der Syntax ist es auch richtig - sonst käme ja auch kein Ergebnis bei Strings ohne Umlaut.

Mein Test-SQL aus phpmyadmin

PHP:
SELECT id,name FROM table WHERE REPLACE(REPLACE(REPLACE(REPLACE(LOWER(name),' ',''),'ue','ü'),'ae','ä'),'oe','ö') = 'stadtosnabrueck'

Ergbnis: Nix gefunden :mad:
 
naja 'name' ist auch keine besonders gut gewählte Spaltenbezeichnung.
'Name' und 'Text' usw. sollte man besser vermeiden, da es auch MYSQL Befehle sein können.

Daran wirds bei Dir aber wohl nicht liegen.
Die Syntax ist einfach bei Dir falsch.
Nicht ue -> ü, sondern ü -> ue umbenennen.

SELECT id,name FROM table WHERE REPLACE(REPLACE(REPLACE(REPLACE(LOWER(name),' ',''),'ü','ue'),'ä','ae'),'ö','oe') = 'stadtosnabrueck'


Achso und klar das bei umlautlosen Einträgen immer ein Ergebnis kam.
Der Vergleich stimmt ja dann immer, weil sowieso nix vorkommt was zu replacen wäre, ausser vllt. das Leerzeichen. ;)
 
Zuletzt bearbeitet:
Da hast Du mich jetzt falsche verstanden:

Leerstelle wird zu keiner Leerstelle, ue wird zu 'ü' usw.

Aus dem Namen der per GET übergeben wird, werden vorher alle Leerzeichen rausgezogen und die Umlaute eintsprechend umgewandelt. Der Query an sich war also ok...

EDIT:

Vergiss was ich geschrieben habe, habe das dummerweise analog von dem Leerzeichen auf die Umlaute umgesetzt, da muss es natürlich genau anders herum - sonst wirds nie was den ue etc steht ja nicht in Feldwert... ich seitze schon wieder zu lange davor. Betriebsblind :)

Achja, und Besten Dank!
 
Zuletzt bearbeitet:
Das kann nicht stimmen, nicht nach Deinem Syntax-Bsp. mit 'stadtosnabrueck'.

Nach Deinem Syntax müsste es genau umgekehrt vorliegen also in der Tabelle die umgewandelten Umlaute und der übergebene string mit Umlauten, sprich so: 'stadtosnabrück'.

hier nochmal zur Verdeulichung was mein Beispiel macht

SELECT id,name FROM table WHERE REPLACE(REPLACE(REPLACE(REPLACE(LOWER('Stadt Osnabrück'),' ',''),'ü','ue'),'ä','ae'),'ö','oe') = 'stadtosnabrueck'

Daraus folgt dann im Vergleich:
'stadtosnabrueck' = 'stadtosnabrueck'
und dann stimmts ja auch.




Es wird nunmal erst Replaced in allen DS (von innen nach aussen) und dann das Ergebnis mit dem String verglichen.

Wenn es anders ist/ sein soll musst Du es umgekehrt machen, also zb. den string replacen, nicht die Spalte oder ähnlich so wie Du es jetzt hast aber auf keinen fall.
 

Ähnliche Themen

Zurück
Oben