Umlaute in Suchanfragen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Umlaute in Suchanfragen

    Hallöle,

    leider konnten mir die gesuchten Beiträge nicht weiterhelfen.

    Wir versuchen eine Suche einzugrenzen. Wenn also z.B. mit suchwort# die mySQL Datenbank durchsucht wird sollen auch nur Datensätze mit genau diesem Wort gefunden werden. Die Suche mit suchwort ohne # findet dagenen alles, wo das suchwort enthalten ist.

    Nun klappt das auch ganz gut, nur wenn genau nach suchwort in dem Datensatz ein Umlaut (ä, ö, ü ß) vorhanden ist werden auch die gefunden.

    Es liegt wohl daran, dass php/mySQL die Umlaute nicht in der Standardzeichentabelle drin hat und deshalb auch nicht akzeptiert bei der Einschränkung.

    Kleines Beispiel

    Suche nach nieder#

    Niederösterreich wird angezeigt (falsch)
    Niederbayern wird nicht angezeigt (richtig)


    Suche nach nieder

    Niederöstereich wird angezeigt (richtig)
    Niederbayern wird angezeigt (richtig)

    Wie kann ich es hinbekommen, dass die Umlaute als normale Zeichen akzeptiert werden?

    Ich danke Euch im Voraus.


    Gruss Mattek

  • #2
    Bitte sei so lieb und poste die Where Bedingung des aufgelösten Select-Strings um das nachvollziehen zu können.

    Handelt es sich um eine LIKE oder REGEXP Bedingung?

    So wie ich das sehe kommt es darauf an, wie dDein Skript die Eingabe des #-Zeichens auflöst, denn:
    Code:
    mysql> select art from woerterbuch;
    +------------------+
    | art              |
    +------------------+
    | nieder           |
    | niederbayern     |
    | niederösterreich |
    | kärnten          |
    +------------------+
    4 rows in set (0.00 sec)
    
    mysql> select art from woerterbuch where art like "%nieder%";
    +------------------+
    | art              |
    +------------------+
    | nieder           |
    | niederbayern     |
    | niederösterreich |
    +------------------+
    3 rows in set (0.00 sec)
    
    mysql> select art from woerterbuch where art = "nieder";
    +--------+
    | art    |
    +--------+
    | nieder |
    +--------+
    1 row in set (0.00 sec)
    
    mysql>

    Kommentar


    • #3
      Hallo,

      danke erstmal. Es wird mit like gemacht. Ich selber hab es leider nicht geschrieben, da ich auch keine Ahnung davon habe, wurde jedoch hängengelassen damit. Der, der es geschrieben hat meinte, dass es nicht möglich ist. Schwer zu glauben. Nun muss ich wohl selber nach Lösungen suchen. Es gibt folgende Suchmöglichkeiten um den Code vielleicht besser zu verstehen.

      Suchwort1 -> Volltextsuche auch inmitten eines Wortes

      Suchwort1 Suchwort2 -> Einschränkung, beide Suchwörter müssen im selben Datensatz vorhanden sein

      Suchwort1+Suchwort2 -> Eines der Suchwörter muss in einem Datensatz vorhanden sein

      #Suchwort1 -> Im Datensatz muss ein Wort mit dem Suchwort1 beginnen

      Suchwort1# -> eindeutige Übereinstimmung im Datensatz mit einem Wort

      Um letzteres geht ja auch



      Und hier der Code wo alles mit like enthalten ist:


      PHP-Code:
      if($s_field){

           for(
      $w=0;$w sizeof($words);$w++){
      $cont=" (";
                 for(
      $t=0;$t count($field_s);$t++){
                  if(
      preg_match("/^#/i",$words[$w])){
                      
      $word str_replace("#","",$words[$w]);
                      if(
      $t sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."' OR ";
                      }else if(
      $t == sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."'";
                      }
                  
                  }else if(
      preg_match("/#$/i",$words[$w])){ 
                      
      $word str_replace("#","",$words[$w]);
                      if(
      $t sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]' OR ";
                      }else if(
      $t == sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]'";
                      }
                  }else{

                      if(
      $t sizeof($field_s)-1){
                      
      $cont .= $field_s[$t]." like '%".$words[$w]."%' OR ";
                      }else if(
      $t == sizeof($field_s)-1){
                      
      $cont .= $field_s[$t]." like '%".$words[$w]."%'";
                      }

                  }

                 }
      $cont.=")";
            if(
      $w == sizeof($words)-1){
            
      $search_query .= "(".spell_check($words[$w],$spell,$field_s,$verk);
            
      $search_query .= "$cont)";
            }else if(
      $w sizeof($words)-1){
            
      $search_query .= "(".spell_check($words[$w],$spell,$field_s,$verk);
            
      $search_query .= "$cont$verk";
            }
           }

      }else{

           for(
      $w=0;$w sizeof($words);$w++){
      $cont=" (";
                for(
      $t=0;$t count($fields);$t++){
                  if(
      preg_match("/^#/i",$words[$w])){
                      
      $word str_replace("#","",$words[$w]);
                      if(
      $t sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."' OR ";
                      }else if(
      $t == sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."'";
                      }

                  }else if(
      preg_match("/#$/i",$words[$w])){ 
                      
      $word str_replace("#","",$words[$w]);
                      if(
      $t sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]' OR ";
                      }else if(
      $t == sizeof($fields)-1){
                      
      $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]'";
                      }
                  }else{
                      if(
      $t sizeof($fields)-1){
                      
      $cont .= $fields[$t]." like '%".$words[$w]."%' OR ";
                      }else if(
      $t == sizeof($fields)-1){
                      
      $cont .= $fields[$t]." like '%".$words[$w]."%'";
                      }
                  }

                }
      $cont.=")"

      Kommentar


      • #4
        Bau mal bitte einen print am Ende dieses Ifs ein
        PHP-Code:
        print "cont:$cont<br>\n"
        Dann laß das Script mit den Suhbegriffen durchlaufen und poste jeweils das Ergebnis des print:

        Suchwort -> cont:...
        Suchwort Suchwort2 -> cont:...
        Suchwort+Suchwort2 -> cont:...
        #Suchwort -> cont:...
        Suchwort# -> cont:...
        #Suchwort# -> cont:...

        Das wätr schonmal eine Hilfe um das Problem nachvollziehen zu können.

        Nebenbei: Kann es nicht sein, daß Suchwort# bedeutet, daß der Begriff am Ende eines Wortes stehen muß und bei #Suchwort# exakt das Suchwort gefunden werden soll?

        Kommentar


        • #5
          danke

          Hallöle,

          ich selberhabe das nicht so hinbekommen wie Du beschrieben hattest. Wahrscheinlich meintest Du, dass ich das auf der mysql konsole probieren sollte. Das Problem ist wohl, dass es ein Windowsserver ist. Die dort installierte Version hat den englischen Zeichensatz kompiliert. Auf einem Linuxserver klappt es nämlich.

          Nun heisst es eine mySQL-Version mit deutschem Zeichensatz zu bekommen oder den halt reinkompilieren.

          Trotzdem danke.



          Gruss Martin

          Kommentar


          • #6
            Nein, das meinte ich nicht. Ich wollte, dass Du nur für Testzwecke nach dem Skriptteil den Du gepostet hast
            PHP-Code:
            print "cont:$cont<br>\n"
            hinzufügst, damit die zusammengebaute Where-Bedingung im Browser angezeigt wird:
            PHP-Code:
            if($s_field){

                 for(
            $w=0;$w sizeof($words);$w++){
                       
            $cont=" (";
                       for(
            $t=0;$t count($field_s);$t++){
                        if(
            preg_match("/^#/i",$words[$w])){
                            
            $word str_replace("#","",$words[$w]);
                            if(
            $t sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."' OR ";
                            }else if(
            $t == sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."'";
                            }
                        
                        }else if(
            preg_match("/#$/i",$words[$w])){ 
                            
            $word str_replace("#","",$words[$w]);
                            if(
            $t sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]' OR ";
                            }else if(
            $t == sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]'";
                            }
                        }else{

                            if(
            $t sizeof($field_s)-1){
                            
            $cont .= $field_s[$t]." like '%".$words[$w]."%' OR ";
                            }else if(
            $t == sizeof($field_s)-1){
                            
            $cont .= $field_s[$t]." like '%".$words[$w]."%'";
                            }

                        }

                       }
            $cont.=")";
                  if(
            $w == sizeof($words)-1){
                  
            $search_query .= "(".spell_check($words[$w],$spell,$field_s,$verk);
                  
            $search_query .= "$cont)";
                  }else if(
            $w sizeof($words)-1){
                  
            $search_query .= "(".spell_check($words[$w],$spell,$field_s,$verk);
                  
            $search_query .= "$cont$verk";
                  }
                 }

            }else{

                 for(
            $w=0;$w sizeof($words);$w++){
            $cont=" (";
                      for(
            $t=0;$t count($fields);$t++){
                        if(
            preg_match("/^#/i",$words[$w])){
                            
            $word str_replace("#","",$words[$w]);
                            if(
            $t sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."' OR ";
                            }else if(
            $t == sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."'";
                            }

                        }else if(
            preg_match("/#$/i",$words[$w])){ 
                            
            $word str_replace("#","",$words[$w]);
                            if(
            $t sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]' OR ";
                            }else if(
            $t == sizeof($fields)-1){
                            
            $cont .= $fields[$t]." RLIKE '[[:<:]]".$word."[[:>:]]'";
                            }
                        }else{
                            if(
            $t sizeof($fields)-1){
                            
            $cont .= $fields[$t]." like '%".$words[$w]."%' OR ";
                            }else if(
            $t == sizeof($fields)-1){
                            
            $cont .= $fields[$t]." like '%".$words[$w]."%'";
                            }
                        }

                      }
            $cont.=")";
            print 
            "cont:$cont<br>\n"// HIEEER <<<------  <<<------ <<<------ <<<------ <<<------ 
            Wenn man dann die angedruckten Ergebnisse hat lasst sich der Fehler viel leichter analysieren. Ich glaube (noch) nicht, dass das Problem was mit einem falschen Zeichensatz zu tun hat.

            Kommentar


            • #7
              Nun hats geklappt. Das mit dem Einbauen meine ich. Folgendes wird ausgespuckt:

              cont: (land_bereich RLIKE '[[:<:]]franz[[:>:]]' OR auskunft RLIKE '[[:<:]]franz[[:>:]]' OR landesvw RLIKE '[[:<:]]franz[[:>:]]' OR hauptort RLIKE '[[:<:]]franz[[:>:]]' OR kfzkz RLIKE '[[:<:]]franz[[:>:]]' OR diff_mesz RLIKE '[[:<:]]franz[[:>:]]' OR diff_mewz RLIKE '[[:<:]]franz[[:>:]]')

              achso ich habe mit franz# gesucht.

              auch französisch wurde mit aufgelistet. fälschlicherweise
              Zuletzt geändert von Mattek; 01.12.2002, 10:14.

              Kommentar


              • #8
                Sag dem der das geschrieben hat, dass gem. seiner Aussage Unmögliche doch möglich ist und zwar deshalb möglich ist weil er bei der Definition der regular Expressions einen kleinen Schönheitsfehler eingebaut hat. Neben den Umlauten werden leider auch allgemein übliche und sprachenunabhängige Sonderzeichen über diese regular Expression Definition nicht korrekt - so wie die Funktion es vorsieht - abgehandelt (:,$;&;:,*, etc).

                Fazit: Kein Zeichensatzproblem!

                Code:
                mysql> select * from country;
                +------------+
                | land       |
                +------------+
                | französich |
                | franz      |
                | franzberg  |
                | franz berg |
                | franz.berg |
                | franzßberg |
                | franz_berg |
                | franz*berg |
                | franz:berg |
                | franz&berg |
                | franz$berg |
                +------------+
                11 rows in set (0.00 sec)
                
                mysql> select * from country where land rlike '[[:<:]]franz[[:>:]]';
                +------------+
                | land       |
                +------------+
                | französich |
                | franz      |
                | franz berg |
                | franz.berg |
                | franzßberg |
                | franz*berg |
                | franz:berg |
                | franz&berg |
                | franz$berg |
                +------------+
                9 rows in set (0.00 sec)
                Per Definition dürfte hier nur "franz" ausgegeben werden, oder?

                Schicke ihm das und richte ihm schöne Grüße aus von mir.

                Kommentar


                • #9
                  Mach ich doch glatt. Ich werde Dirf berichten was rauskam.

                  Dank Dir erstmal

                  Kommentar


                  • #10
                    franz berg
                    franz.berg
                    dürften auch korrekt sein

                    Kommentar

                    Lädt...
                    X