T-Rex: simpler Query mit like führt zu Fehler

Moin,

hab da eine Tabelle. Da ist ein Textfeld drin. Ich mach eine simple like abfrage und bekomme Ergebnisse die nicht der Suchanfrage entsprechen:

select * from table where text like '%suchwort%'

Jetzt werden auch Datensätze gefunden wo "suchwort" nicht im text vorkommt.

MySQL: 5.5.8
Tabellentyp: MyISAM

Gruß
My-Rex

  1. Mittag :)

    hab da eine Tabelle. Da ist ein Textfeld drin. Ich mach eine simple like abfrage und bekomme Ergebnisse die nicht der Suchanfrage entsprechen:

    select * from table where text like '%suchwort%'

    Jetzt werden auch Datensätze gefunden wo "suchwort" nicht im text vorkommt.

    Kannst du, wenn möglich, ein Beispiel geben, welches bei dir vorkommt? Also am besten einfach eine Query, wie sie bei dir vorkommt. Der Text hinter Like ist ja ein Regex ausdruck. Dadurch kann es in eingien Fällen zu komischen Ergebnissen kommen.

    Grüße,

    Junker

    1. Query: SELECT *  FROM rezepttext WHERE REZEPTTEXT\_SEARCH LIKE '%kuchen%'

      Es kommt ein Ergebnis wo "REZEPTTEXT_SEARCH" diesen Content hat:

      RISOTT RISOTTOE RISOTTOS RISOTTON RISOTTO TEMPERATURE TEMPERATU TEMPERATURN TEMPERATURS TEMPERATUR REI REISE REISS REISN REIS HÜHNERBRÜHE HÜHNERBRÜH HÜHNERBRÜHEN HÜHNERBRÜHEE HÜHNERBRÜHES ITALIENISCHE ZWIEBELN ZWIEBEL ZWIEBELE

      Wie man sieht steckt der String "kuchen" da nicht drin.

      Gruß
      Torten-Rex

      1. Query: SELECT *  FROM rezepttext WHERE REZEPTTEXT\_SEARCH LIKE '%kuchen%'

        Es kommt ein Ergebnis wo "REZEPTTEXT_SEARCH" diesen Content hat:

        RISOTT RISOTTOE RISOTTOS RISOTTON RISOTTO TEMPERATURE TEMPERATU TEMPERATURN TEMPERATURS TEMPERATUR REI REISE REISS REISN REIS HÜHNERBRÜHE HÜHNERBRÜH HÜHNERBRÜHEN HÜHNERBRÜHEE HÜHNERBRÜHES ITALIENISCHE ZWIEBELN ZWIEBEL ZWIEBELE

        Wie man sieht steckt der String "kuchen" da nicht drin.

        Das ist in der Tat wohl war :D
        Vielleicht noch die altbekannte Frage/Ratschlag, ob du auch wirklich nur genau diese Query ausführst, oder ob in deiner Version noch andere Zusätze drin sind oder weitere Befehle, die die ausgeführte Query oder den zurückgegeben Datensatz beeinflussen.  Oftmals sind Fehler an Stellen, wo man sie nicht erwartet.....

        Grüße,

        Junker

        1. Am Ende ist es schon ein größerer Query. Doch allein das kleine Ding was ich gepostet habe, liefert im phpmyadmin mist zurück. Ich hab local sogar schon die Indexe gelöscht.
          Auch ein versuch auf match against um zu steigen hat zwar bessere aber immer noch fehlerhafte Ergebnisse geliefert.

          Also bei REZEPTTEXT_SEARCH handelt es sich um ein text feld. Da zurückgegebene Ergebnis habe ich auch etwas beschnitten. Das was du da oben siehst (RISOTTO etc.) hat in Wirklichkeit 3000 Zeichen. Eventuell sind das zu viele für ein like?

          Gruß
          Queryloser
          T-Rex

          1. Hallo,

            Das was du da oben siehst (RISOTTO etc.) hat in Wirklichkeit 3000 Zeichen.

            Und du bist sicher, dass du da keinen Kuchen mit weggeschnitten hast?

            Gruß
            Kalk

            1. Hallo,

              Das was du da oben siehst (RISOTTO etc.) hat in Wirklichkeit 3000 Zeichen.

              Und du bist sicher, dass du da keinen Kuchen mit weggeschnitten hast?

              Ob das auch mit "Marmelade" klappt könnte auch interessant sein. Vielleicht kommt ja irgendwas mit "küchen" in den Fundstellen vor und wird als "enthält" angesehen weil irgendwas mit der Kodierung nicht stimmt.

              Jörg Reinholz

              1. Ob das auch mit "Marmelade" klappt könnte auch interessant sein. Vielleicht kommt ja irgendwas mit "küchen" in den Fundstellen vor und wird als "enthält" angesehen weil irgendwas mit der Kodierung nicht stimmt.

                Jörg Reinholz

                Du hattest recht. Es wird "küchen" gefunden. Bei Marmelade klappt alles.
                Kuchen ist glaube ich das einzige Wort, das mit einem Umlaut geschrieben ein anderes Wort ergibt, dass im gleichen Umfeld zuhause ist...

                Die Tabelle und das Feld stehen auf "utf8_general_ci".
                Wie muss ich die Kollation einstellen, damit nur noch "kuchen" gefunden wird?

                Gruß
                utf8_t_rex

                1. Tach!

                  Du hattest recht. Es wird "küchen" gefunden. Bei Marmelade klappt alles.
                  Die Tabelle und das Feld stehen auf "utf8_general_ci".
                  Wie muss ich die Kollation einstellen, damit nur noch "kuchen" gefunden wird?

                  utf8_bin. Allerdings wird dann auch zwischen Groß- und Kleinschreibung unterschieden. Und man muss nicht unbedingt das Feld umstellen, man kann das auch im Statement machen, indem man das Wort BINARY vor den Feldnamen stellt.

                  Literatur zu den Unicode-Kollationen: http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-sets.html

                  dedlfix.

                  1. indem man das Wort BINARY vor den Feldnamen stellt.

                    So?
                    select * from table where BINARY text like '%suchwort%'

                    Wenn ja, ich hab es gerade ausprobiert, hat nichts gebracht. Die Ergebnismenge hat sich nicht geändert.

                    Danke für eure Hilfe !

                    Gruß
                    dankbarer
                    T-Rex

                    1. Tach!

                      Wenn ja, ich hab es gerade ausprobiert, hat nichts gebracht. Die Ergebnismenge hat sich nicht geändert.

                      Dann erzeug mal bitte in Testszenario, das nur das allernötigste enthält, um den Fehler nachzustellen. Also eine Tabelle mit einem Feld und darin so wenig wie möglich Daten. Du hast sie ja wohl als Stringwurst und nicht normalisiert abgelegt. Wirf soviel Teile raus, bis der Fehler grad noch so da ist. Dann zeig mal einen Export der Tabelle inklusive Daten und Struktur.

                      dedlfix.

          2. Hey,

            Also bei REZEPTTEXT_SEARCH handelt es sich um ein text feld. Da zurückgegebene Ergebnis habe ich auch etwas beschnitten. Das was du da oben siehst (RISOTTO etc.) hat in Wirklichkeit 3000 Zeichen. Eventuell sind das zu viele für ein like?

            Zuviele Zeichen sind das nicht, habe schon viel größere textfelder "geliked". Braucht halt nur länger. Wenn du nach '%kuchen%' suchst, und ein Ergebnis kommt zurück, muss da eigentlich auch kuchen drin sein. Schau nochmal genau nach (was du wahrscheinlich eh schon getan hast, aber doppelt gemoppelt hält besser).

            Und das mit der Kodierung würde ich auch nochmal näher anschauen (siehe Jörgs Beitrag)

            Grüße,

            Junker