MySQL Trigger mit urldecode Funktion

Dunas

Erfahrenes Mitglied
Nabend!

Ich sitze gerade an einem kleinem Problem.
Ich lade Datensätze aus einer Datei in meine Db. Eine Spalte des Datensatzes ist mit der Php-Funktion "urlencode" bearbeitet worden.

Wenn ich nun die Datensätze einlade, möchte ich über einen Trigger die Codierung rückgängig machen.
Dazu habe ich mir eine Funktion geschrieben.

SQL:
CREATE FUNCTION `url_decodieren`(string_codiert varchar(100)) 
RETURNS varchar(100) CHARSET latin1

BEGIN

DECLARE gefunden,ende,stelle INT DEFAULT 0;
DECLARE zeichen_uncodiert VARCHAR(1);
DECLARE codiertes_zeichen VARCHAR(3);
DECLARE zeichenLesen CURSOR FOR SELECT codiert,zeichen FROM `url_decod`;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET ende = 1;



Open zeichenLesen;

REPEAT
  FETCH zeichenLesen INTO codiertes_zeichen, zeichen_uncodiert;
  set gefunden = 1;

  WHILE (gefunden = 1) DO
    set gefunden = 0;
	set stelle = INSTR( string_codiert, codiertes_zeichen);
  IF (stelle <> 0) Then
	set string_codiert = INSERT(string_codiert, stelle, 3, zeichen_uncodiert);
	set gefunden = 1;
    END IF;
	END WHILE;

UNTIL ende END REPEAT;

return string_codiert;

END

Die Funktion greift auf die Tabelle `url_decod` zu, die wie folgt aufgebaut ist:

`zeichen` varchar(1) collate latin1_german1_ci NOT NULL,
`codiert` varchar(3) collate latin1_german1_ci NOT NULL

Ein Datensatz sieht so aus:
| zeichen | codiert
| -------------------------
| ^ | %5E

Nun habe ich einen Trigger geschrieben
SQL:
CREATE TRIGGER umcodierenBEFORE INSERT ON tabelle
  FOR EACH ROW BEGIN
    SET NEW.name = url_encodieren(NEW.name);
  END;

Mein Problem ist jetzt nur, dass sich die Ausführzeit extrem erhöht obwohl grad mal ein Zeichen decodiert wird.

ohne decodierung:
Eingefügte Zeilen: 309299
(die Abfrage dauerte 4.6125 sek.)

mit decodierung:
Eingefügte Zeilen: 309299
(die Abfrage dauerte 177.5042 sek.)

Kann mir jemand eine andere Möglichkeit zum decodieren nennen oder meine Funktion/Trigger optimieren?

Danke Dunas
 
Zuletzt bearbeitet von einem Moderator:
Zurück