Andreas-Lindig: Äh, wie sucht man ein 'ä' in MySql?

liebes Forum,

'' finde ich ja mittlerweile dank der freundlichen Hilfe des linken Setzers in meiner MySql-DB. Aber nun machen die deutschen Umlaute mir Sorgen:
wenn ich 'ä' suche (LIKE '%ä%'), bekomme ich zwar auch 'ä', aber auch alle Datensätze mit ''.
Und mein Forum gibt neuerdings (seit ich Datensätze mit 'ä' habe) ein Posting mit der nicht vorhandenen ID=0 aus (aber das ist im Moment zweitrangig).

leider habe ich zu Umlauten rein gar nichts gefunden.
kann mir jemand helfen?

vielen Dank und Gruß, Andreas
--
http://forum.andeas-lindig.de

  1. Hallo Andreas-Lindig,

    '' finde ich ja mittlerweile dank der freundlichen Hilfe
    des linken Setzers in meiner MySql-DB. Aber nun machen die
    deutschen Umlaute mir Sorgen:

    Warum? Sollte keinerlei Probleme geben -- MySQL kann mit so
    ziemlich allen Schriftsaetzen klarkommen, selbst mit Big5.

    wenn ich 'ä' suche (LIKE '%ä%'), bekomme ich zwar auch
    'ä', aber auch alle Datensätze mit ''.

    Du weisst, dass die Abfrage oben einen sequential table scan
    nach sich zieht?

    Und mein Forum gibt neuerdings (seit ich Datensätze mit
    'ä' habe) ein Posting mit der nicht vorhandenen ID=0 aus
    (aber das ist im Moment zweitrangig).

    Das dürfte prinzipiell nicht an MySQL liegen.

    leider habe ich zu Umlauten rein gar nichts gefunden.
    kann mir jemand helfen?

    Ohne genauere Beschreibung der Umstaende: nein. Wichtig sind
    Infos wie MySQL-Version, wie du auf die DB zugreifst, welche
    Quoting-Methoden du verwendest, etc.

    Gruesse,
     CK, right back from Germersheim

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    1. Hi,

      wenn ich 'ä' suche (LIKE '%ä%'), bekomme ich zwar auch
      'ä', aber auch alle Datensätze mit ''.

      Du weisst, dass die Abfrage oben einen sequential table scan
      nach sich zieht?

      Hä? nein. Was ist das denn?

      kann mir jemand helfen?
      Ohne genauere Beschreibung der Umstaende: nein. Wichtig sind
      Infos wie MySQL-Version, wie du auf die DB zugreifst, welche
      Quoting-Methoden du verwendest, etc.

      Version: 3.23.42 (o.ä. - kann gerade nicht nachsehen)
      Quoting: Äh, ich weiss nicht genau, was Du meinst, aber die Abfrage ist genau so, wie sie oben steht.
      Zugriff: hmm..., halt wie ich es immer mache mit MySql-Front oder über PHP.

      Gruß, Andreas

      1. Hi Andreas-Lindig,

        wenn ich 'ä' suche (LIKE '%ä%'), bekomme ich zwar auch
        Du weisst, dass die Abfrage oben einen sequential table scan
        nach sich zieht?
        Hä? nein. Was ist das denn?

        Du verzichtest auf die Verwendung allfälliger Indexbäume und läßt für jede Abfrage jeden Datensatz sequentiell überprüfen. Das ist nicht gerade die performanteste aller Lösungen.

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
         => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
        Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
        1. Hi,

          Du verzichtest auf die Verwendung allfälliger Indexbäume und läßt für jede Abfrage jeden Datensatz sequentiell überprüfen. Das ist nicht gerade die performanteste aller Lösungen.

          ja, wie muß ich's denn richtig machen? Mit so aufwendiger Datenbanksuche bin ich bei diesem Projekt das erste Mal beschäftigt. Es soll noch schlimmer kommen: ich plane eine Volltextsuche.
          Wie wird das denn hier gemacht?

          Gruß, Andreas

          1. Hi Andreas-Lindig,

            ja, wie muß ich's denn richtig machen?

            das kommt auf Deine Aufgabenstellung an.

            Mit so aufwendiger Datenbanksuche bin ich bei diesem Projekt das erste Mal beschäftigt. Es soll noch schlimmer kommen: ich plane eine Volltextsuche.

            Lies und verstehe das mySQL-Konzept des MYISAM-FULLTEXT-Indexes. Das könnte Deiner Vorstellung mit minimalem Aufwand von Deiner Seite schon sehr nahe kommen.

            Ein zufällig herausgegriffener Google-Treffer dazu, der mir auf den ersten Blick gut verständlich erscheint:
                http://www.databasejournal.com/features/mysql/article.php/1578331

            Wie wird das denn hier gemacht?

            Die Suchfunktion des Self-Portals ist ein Perl-Skript mit CVS-ähnlichen 'Indexdateien' - und weitaus primitiver als das, was Du gerade baust. Zum Glück ist die Hardware hier ziemlich schnell ...

            Viele Grüße
                  Michael

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
            (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
             => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
            Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
            1. Hi,

              ja, wie muß ich's denn richtig machen?
              das kommt auf Deine Aufgabenstellung an.

              halt, ein Forum durchsuchen, nach Name, Thema, Datum, Inhalt des Postings.

              Lies und verstehe das mySQL-Konzept des MYISAM-FULLTEXT-Indexes.

              hab' schon angefangen.

              Die Suchfunktion des Self-Portals ist ein Perl-Skript mit CVS-ähnlichen 'Indexdateien'

              Und wie erstellt man so eine Index-Datei? Ich will ja die Volltextsuche nicht nur in der DB durchführen, sondern auch in Dateien - da liegen nämlich die Beiträge drin (es handelt sich um ein Forum)

              Ein zufällig herausgegriffener Google-Treffer dazu, der mir auf den ersten Blick gut verständlich erscheint: http://www.databasejournal.com/features/mysql/article.php/1578331

              vielen Dank, da brauche ich erst mal Zeit für...

              Gruß, Andreas

              1. Hi Andreas,

                ja, wie muß ich's denn richtig machen?
                das kommt auf Deine Aufgabenstellung an.
                halt, ein Forum durchsuchen, nach Name, Thema, Datum, Inhalt des Postings.

                modelliere ein Forum-Posting als MYISAM-Tabelle, setze einen FULLTEXT-Index drauf, generiere entsprechende SQL-Queries, führe diese aus, sauge das Ergebnis ab, generiere entsprechende Treffer-Anzeigeseiten.

                Die Suchfunktion des Self-Portals ist ein Perl-Skript mit CVS-ähnlichen 'Indexdateien'
                Und wie erstellt man so eine Index-Datei?

                Durch ein Konverter-Skript, welches aus den Postings die relevanten Informationen heraus parsed (Du willst sicherlich nicht den HTML-Layout-Code Deines Forums durchsuchbar machen?).

                Beim Self-Portal geschieht dies durch einen separaten Prozeß, der etwa SelfHTML 8.0 als Eingabe-Dateibaum liest und eine entsprechende Indexdatei ausgibt; beim Forum ist das meines Wissens derzeit ein täglich laufendes Skript mit ähnlicher Funktionalität (deshalb sind archivierte Postings erst nach etwa einem Tag über die Suche auffindbar).

                Bei Deinem Forum wäre dies eine Funktion, die innerhalb der Poster-Logik aufzurufen wäre - dort hast Du alle erforderlichen Informationen vorliegen und kannst die Datenstruktur der Suchfunktion entsprechend pflegen.

                Ich will ja die Volltextsuche nicht nur in der DB durchführen,

                Ich schon - wenn FULLTEXT mir mehrere tausend Zeilen eigenen Quelltext einspart und performanter ist als das, was ich selbst schreiben könnte. Ich habe so eine Suchmaschine mit dem Äquivalent von einer Million "Postings" drin - und die funktioniert prima.

                sondern auch in Dateien - da liegen nämlich die Beiträge drin (es handelt sich um ein Forum)

                Die Suchfunktion darf (und sollte, in diesem Fall) eine (parallel zu pflegende) redundante Datenstruktur mit denselben Posting-Inhalten wie das Forum verwenden, welche auf ihre spezifischen Bedürfnisse (Performance) optimiert ist.
                Ob diese separate Datenstruktur eine Datenbank oder eine CVS-Datei ist, das hängt von den spezifischen Bedürfnissen ab, also was genau Du alles finden können willst und welche der möglichen Such-Anforderungen wie performant erledigt werden müssen. Steigende Ansprüche ziehen steigenden "Investitionsbedarf" nach sich, auch bezüglich der verwendeten Basistechnologien.

                In meinem konkreten Fall ist es sogar so, daß ich die gesamte Datenhaltung in der Datenbank vorgenommen habe - mein "Posting-Viewer" liest den Inhalt des Postings aus derselben Tabelle, über deren FULLTEXT-Index die Suchfunktion dieses Posting gefunden hätte.
                Dies liegt in meinem Fall daran, daß ich nicht wirklich ein "Forum" betreibe, sondern ein Nachrichtenarchiv - es gibt bei mir kein Äquivalent zur Forumshauptdatei, sondern alle Zugriffe erfolgen zunächst einmal über einen Suchvorgang (selbst die 'Liste der aktuellsten Beiträge' ist bei mir ein Such-Ergebnis - das Tabellen-System ist für diese Anforderung entsprechend getuned). Ich habe auch keine "Threads" - insofern ist meine Aufgabenstellung eine signifikant andere als bei einem normalen Forum, und nicht alle Erkenntnisse sind problemlos übertragbar ...

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
                1. Hi,

                  halt, ein Forum durchsuchen...

                  modelliere ein Forum-Posting als MYISAM-Tabelle, setze einen FULLTEXT-Index drauf, generiere entsprechende SQL-Queries, führe diese aus, sauge das Ergebnis ab, generiere entsprechende Treffer-Anzeigeseiten.

                  meinst Du eine extra-Tabelle für die Posting-Inhalte oder eine, wo die Inhalte halt mit drinstehen?

                  Und wie erstellt man so eine Index-Datei?
                  Durch ein Konverter-Skript, welches aus den Postings die relevanten Informationen heraus parsed (Du willst sicherlich nicht den HTML-Layout-Code Deines Forums durchsuchbar machen?).

                  nein, ich schreibe bisher den reinen Text in die Datei. Der HTML-Text wird erst im PHP-Script gebastelt - immer für die eine Ausgabe.

                  Ich will ja die Volltextsuche nicht nur in der DB durchführen,
                  Ich schon - wenn FULLTEXT mir mehrere tausend Zeilen eigenen Quelltext einspart...

                  huch... soviel?

                  sondern auch in Dateien - da liegen nämlich die Beiträge drin

                  Die Suchfunktion darf (und sollte, in diesem Fall) eine (parallel zu pflegende) redundante Datenstruktur mit denselben Posting-Inhalten wie das Forum verwenden, welche auf ihre spezifischen Bedürfnisse (Performance) optimiert ist.

                  ohje, hab' ich mal wieder verschätzt

                  Ob diese separate Datenstruktur eine Datenbank oder eine CVS-Datei ist, das hängt von den spezifischen Bedürfnissen ab, also was genau Du alles finden können willst und welche der möglichen Such-Anforderungen wie performant erledigt werden müssen.

                  hmm, hmm...,
                  Ich hab' gerade mal 'CSV-Dateien' nachgeschlagen. Das sind also Dateien in der Form:
                  name1=wert1; name2=wert2; name3=wert3...
                  oder für dieses Forum vielleicht:
                  ID=123856; Autor='Andreas-Lindig'; Thema='wie sucht man 'ä' in MySql'; Datum=20030627132100...

                  Speichert Ihr so alles ab was im Archiv landet und in der Datenbank steht das gar nicht mehr? Und wenn ja, ist das der Grund, warum man im aktuellen Forum, der 'Hauptdatei' nicht suchen kann?

                  ...alle Zugriffe erfolgen zunächst einmal über einen Suchvorgang (selbst die 'Liste der aktuellsten Beiträge' ist bei mir ein Such-Ergebnis) ...

                  so ist es bei mir auch, ich habe auch kein 'Archiv' - bei mir kann man beliebig weit ins Forum zurück gehen.

                  und: was ist nun mit meinem 'ä'? ;)

                  Gruß, Andreas

                  1. Hallo Andreas,

                    Speichert Ihr so alles ab was im Archiv landet und in der Datenbank steht das gar nicht mehr? Und wenn ja, ist das der Grund, warum man im aktuellen Forum, der 'Hauptdatei' nicht suchen kann?

                    Mit "Ihr" meinst Du sicherlich das SELFHTML Forum. Wenn ich jetzt von der aktuellen Version von Christian Kruse ausgehe: Die Threads sind alle im Hauptspeicher geladen und werden von einem Dämon, also einer Art "Serverprogramm" verwaltet. Alle CGI-Scripte, die aufgerufen werden, verbinden sich mit diesem Dämon und erledigen alles über ihn. Wenn der Dämon heruntergefahren wird, werden alle Postings in XML-Dateien auf der Festplatte abgelegt; wenn er hochgefahren wird, liest er sich diese wieder ein. Zur Datensicherheit wird jede halbe Stunde der Inhalt auf die Festplatte geschrieben und nicht nur, wenn der Server heruntergefahren wird. Wenn ein Thread archiviert wird, wird die XML-Datei in ein anderes Verzeichnis verschoben, von wo aus sie dann mit dem Archiv-Viewer, der über mod_rewrite eingebunden ist, angesehen werden kann.

                    und: was ist nun mit meinem 'ä'? ;)

                    Hmmmm. Ich habe das soeben getestet - und bei mir macht er es genauso. Jetzt bin ich total ratlos.

                    Viele Grüße,
                    Christian

                    1. Hi,

                      Mit "Ihr" meinst Du sicherlich das SELFHTML Forum. Wenn ich jetzt von der aktuellen Version von Christian Kruse ausgehe: Die Threads sind alle im Hauptspeicher geladen [...] von wo aus sie dann mit dem Archiv-Viewer, der über mod_rewrite eingebunden ist, angesehen werden kann.

                      das ist ja kompliziert - was für Profis ;)

                      und: was ist nun mit meinem 'ä'? ;)

                      Hmmmm. Ich habe das soeben getestet - und bei mir macht er es genauso. Jetzt bin ich total ratlos.

                      da bin ich ja schon etwas beruhigt, daß es nicht an meiner Doofheit liegt ;)

                      Gruß, Andreas

        2. Hallo Michael,

          Du verzichtest auf die Verwendung allfälliger Indexbäume und läßt für jede Abfrage jeden Datensatz sequentiell überprüfen. Das ist nicht gerade die performanteste aller Lösungen.

          Es ist zwar auffaellig, mit welcher Selbstverstaendlichkeit hier und in vielen anderen vergleichbaren Faellen, die ich so lese im Forum, potentiellen Schwaechen eines Scripts oder Programmteils kritisiert werden. Aber die Kritik muss sich auch mal hinterfragen lassen. Erfahrungsgemaess liegt die Groesse viele DB-Tabellen im voellig unkritischen Bereich. Frag also lieber erst mal nach der Tabellengroesse. Warum sollte jemand eine Tabelle mit ein paar zig oder hundert KB nicht einfach sequentiell durchsuchen?

          Nur mal so als Anregung und Kritik der Kritik ;-)

          viele Gruesse
            Stefan Muenz

          1. Hallo Stefan,

            Erfahrungsgemaess liegt die Groesse viele DB-Tabellen im voellig unkritischen Bereich. Frag also lieber erst mal nach der Tabellengroesse. Warum sollte jemand eine Tabelle mit ein paar zig oder hundert KB nicht einfach sequentiell durchsuchen?

            es mag im vorliegenden Falle ein Unterschied im Bereich der Meßbarkeitsgrenze sein - vielleicht aber auch nicht. Ein linearer Ansatz wird im Vergleich zu einem logarithmischen schon ein paar Zehnerpotenzen weiter unten "teuer". Statt im Einzelfall nach der Tabellengröße zu fragen, erkläre ich lieber das Prinzip als solches - das hat mit dem Fisch und dem Fischen zu tun, und es dient letztlich dem Self-Gedanken (IMHO).

            Eine Suchfunktion basierend auf SQL in der bisher beschriebenen Weise wird in ihren Antwortzeiten extrem streuen - die Erklärung dafür ist für einen 4GL-Anwender, der den intern generierten 3GL-Code nicht kennt, nicht immer nachvollziehbar (die Ausgabe von EXPLAIN ist alles andere als selbsterklärend).

            Wenn man das Prinzip der Indexbäume einmal verstanden hat (und so schwer ist das gar nicht), dann macht man bestimmte Dinge in alle Ewigkeit richtig - das ist nicht anders, als wenn man sich dazu entschlossen hat, HTML-Dokumente zu validieren.

            Viele Grüße
                  Michael

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
            (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
             => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
            Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
            1. Hallo Ihr beiden,

              Erfahrungsgemaess liegt die Groesse viele DB-Tabellen im voellig unkritischen Bereich.

              ist bei mir zunächst wohl auch so, aber ich habe bisher nicht die Kompetenz, das zu beurteilen.

              Statt im Einzelfall nach der Tabellengröße zu fragen, erkläre ich lieber das Prinzip als solches - das hat mit dem Fisch und dem Fischen zu tun, und es dient letztlich dem Self-Gedanken (IMHO).

              es verunsichert mich zwar ziemlich, aber so bekomme ich Denkanstöße zu Sachen, von denen ich noch gar nichts wußte - das finde ich gut, denn eigentlich will ich mich auch irgendwann  mal in 'professioneller' Programmierung sicher fühlen.

              Wenn man das Prinzip der Indexbäume einmal verstanden hat (und so schwer ist das gar nicht), dann macht man bestimmte Dinge in alle Ewigkeit richtig.

              Prima! nur: wie macht man das? Weißt Du da was zu lesen drüber?

              Gruß, Andreas

              1. Hi Andreas-Lindig,

                Wenn man das Prinzip der Indexbäume einmal verstanden hat (und so schwer ist das gar nicht), dann macht man bestimmte Dinge in alle Ewigkeit richtig.
                Prima! nur: wie macht man das? Weißt Du da was zu lesen drüber?

                hm ... ich habe das einerseits in verschiedenen Vorlesungen gelernt und andererseits von einem Kollegen, dessen DBA-Funktion in einem Projekt ich übernehmen mußte. Aber bei der Beschreibung von CREATE TABLE sollten zumindest Verweise auf die entsprechenden Hintergründe zu finden sein - und mit den entsprechenden Suchbegriffen kann man dann Hintergrund-Artikel über Suchmaschinen finden. Die beste reine Lektüre war für mich der "Performance Tuning Guide" des entsprechenden RDBMS (nämlich Oracle7).

                Solide Grundlagen in Sachen "Suchen und Sortieren" (Informatik Grundstudium, ca. 3. Semester; in meinem Fall aus dem Buch "Algorithmen und Datenstrukturen" von Niklaus Wirth) und ein bißchen Komplexitätstheorie (ca. 4. Semester) werden hierbei allerdings vorausgesetzt, wenn man z. B. selbst ausrechnen können will, um wieviele Zehnerpotenzen ein bestimmtes Verfahren in einem konkreten Fall besser ist oder ab welcher Tabellengröße es sich wie sehr lohnt.

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
      2. Hallo Andreas-Lindig,

        kann mir jemand helfen?
        Ohne genauere Beschreibung der Umstaende: nein. Wichtig
        sind Infos wie MySQL-Version, wie du auf die DB
        zugreifst, welche Quoting-Methoden du verwendest, etc.

        Version: 3.23.42 (o.ä. - kann gerade nicht nachsehen)

        Keine Bugs diesbezüglich bekannt (eben nachgeschaut).

        Quoting: Äh, ich weiss nicht genau, was Du meinst, aber
        die Abfrage ist genau so, wie sie oben steht.

        Ja, nur, wie quotest du die Daten? ;) Du wirst ja wohl kaum
        die Daten einfach ungequotet und ungeprueft vom User
        uebernehmen.

        Zugriff: hmm..., halt wie ich es immer mache mit
        MySql-Front oder über PHP.

        Aha, verwendest du mysql_escape_string()?

        Gruesse,
         CK, right back from Germersheim

        --
        http://cforum.teamone.de/
        http://wishlist.tetekum.de/
        If God had meant for us to be in the Army, we would have been born with green, baggy skin.
        1. Hi,

          Quoting: Äh, ich weiss nicht genau, was Du meinst, aber
          die Abfrage ist genau so, wie sie oben steht.
          Ja, nur, wie quotest du die Daten? ;) Du wirst ja wohl kaum
          die Daten einfach ungequotet und ungeprueft vom User
          uebernehmen.

          <gebückt schleichend mit leisem wispern>
             doch, eigentlich schon...
          </gebückt schleichend mit leisem wispern>

          Ich mach zwei Varianten:
          1. ich lese alle vorhandenen Anfangsbuchstaben aus der DB aus (Suche nach Namen) und biete sie in Select-Boxen an. Man kann auswählen, und darauf folgend werden möglliche Namen angeboten, die kann man wieder auswählen.
          2. man kann einen String eingeben (z.B. auch 'ä') und darauf werden auch mögliche Namen vorausgewählt...

          Zugriff: hmm..., halt wie ich es immer mache mit
          MySql-Front oder über PHP.
          Aha, verwendest du mysql_escape_string()?

          nicht bewußt ;) muß mal nachschauen - ist das einen MySql-Einstellung?

          1. Hallo Andreas-Lindig,

            Quoting: Äh, ich weiss nicht genau, was Du meinst, aber
            die Abfrage ist genau so, wie sie oben steht.
            Ja, nur, wie quotest du die Daten? ;) Du wirst ja wohl kaum
            die Daten einfach ungequotet und ungeprueft vom User
            uebernehmen.
            <gebückt schleichend mit leisem wispern>
               doch, eigentlich schon...
            </gebückt schleichend mit leisem wispern>

            Na, dann gute Nacht. Damit kann man problemlos jeden
            beliebigen SQL-Code ausfuehren lassen...

            Ich mach zwei Varianten:
            [...]

            Du solltest *jeden* String, der vom User kommt, per
            mysql_escape_string() (das ist eine PHP-Funktion!) escapen
            lassen. User sind boese[tm], sie machen grundsaetzlich Sachen,
            mit denen man nicht gerechnet hat.

            Zugriff: hmm..., halt wie ich es immer mache mit
            MySql-Front oder über PHP.
            Aha, verwendest du mysql_escape_string()?

            nicht bewußt ;) muß mal nachschauen - ist das einen
            MySql-Einstellung?

            Nein, eine PHP-Funktion.

            Gruesse,
             CK

            --
            http://cforum.teamone.de/
            http://wishlist.tetekum.de/
            If God had meant for us to be in the Army, we would have been born with green, baggy skin.
            1. HI,

              Du solltest *jeden* String, der vom User kommt, per
              mysql_escape_string() (das ist eine PHP-Funktion!) escapen
              lassen.

              ja, ich habe nachgesehen:
              mysql_escape_string macht doch nichts anderes als addslashes. Das jedenfalls mache ich, aber bei Umlauten geschieht da doch gar nichts. Diese Funktion escaped \ und ' und ". Du sprichst immer von 'quoten' - ist damit das escapen gemeint?

              ...Na, dann gute Nacht. Damit kann man problemlos jeden
              beliebigen SQL-Code ausfuehren lassen...

              hoffe, das geht jetzt doch nicht, wo ich doch 'addslashes benutze. Kann mir das auch nicht ganz vorstellen: in meiner Abfrage steht

              WHERE AutorName LIKE '%vom_User_übergebenes_Argument%'

              oder

              WHERE AutorName = 'vom_User_übergebenes_Argument'

              wenn der da irgend einen SQL-Scheiß reinschreibt, ist die Abfrage doch syntaktisch falsch bzw. die Wörter werden gefunden, oder?

              allerdings weiß ich immer noch nicht, warum bei Umlauten immer auch so viele andere Datensätze gefunden werden ;)

              gruß, Andreas

              1. Hi Andreas-Lindig,

                ...Na, dann gute Nacht. Damit kann man problemlos jeden
                beliebigen SQL-Code ausfuehren lassen...
                hoffe, das geht jetzt doch nicht, wo ich doch 'addslashes benutze. Kann mir das auch nicht ganz vorstellen: in meiner Abfrage steht
                WHERE AutorName LIKE '%vom_User_übergebenes_Argument%'
                oder
                WHERE AutorName = 'vom_User_übergebenes_Argument'
                wenn der da irgend einen SQL-Scheiß reinschreibt, ist die Abfrage doch syntaktisch falsch bzw. die Wörter werden gefunden, oder?

                akzeptiert Deine Funktions-API als Parameter auch mehrere, durch Semikolon getrennte SQL-Statements?
                Falls ja, dann könnte die Einfügung das erste Statement syntaktisch korrekt abschließen und ein zweites Statement seiner Wahl ("drop table <name>" etc.) ausführen, während ein drittes, bedeutungsloses Statement dann mit dem Ende Deines gequoteten Strings zusammenpaßt.
                Du würdest in diesem Falle ggf. noch nicht mal einen Returncode zurückgeliefert bekommen, der Dich mißtrauisch machen könnte.

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
                1. Hallo Michael,
                  konnte leider länger nicht mehr ins Internet, aber zum Glück bist Du ja noch da.

                  akzeptiert Deine Funktions-API als Parameter auch mehrere, durch Semikolon getrennte SQL-Statements?

                  ich bin noch nicht so firm: ist meine 'funktions-API' mein Einleseformular bzw. der Funktionsaufruf, der die Eingabe eintgegennimmt?
                  Ich kann im Moment nicht testen, aber das müsste möglich sein.

                  [...] SQL-Statement syntaktisch korrekt abschließen [...]

                  das ist aber alles gefährlich!
                  was muß ich denn nun alles ausschliessen, um
                  1. Gefahren auszuschliessen.
                  2. dem User möglichst viele Zeichen zu ermöglichen.

                  mir ist noch immer nicht klar, was genau mit 'quoten' gemeint ist.

                  Gruß, Andreas

                  1. Hi Andreas-Lindig,

                    akzeptiert Deine Funktions-API als Parameter auch mehrere, durch Semikolon getrennte SQL-Statements?
                    ich bin noch nicht so firm: ist meine 'funktions-API' mein Einleseformular bzw. der Funktionsaufruf, der die Eingabe eintgegennimmt?

                    die Schnittstelle zwischen Deinem PHP-Programm und der Datenbank.
                    (Das, was bei Perl das DBI::-Modul wäre.)

                    Ich kann im Moment nicht testen, aber das müsste möglich sein.

                    Tja, dann ... hm.

                    das ist aber alles gefährlich!

                    Eben.

                    was muß ich denn nun alles ausschliessen, um

                    1. Gefahren auszuschliessen.
                    2. dem User möglichst viele Zeichen zu ermöglichen.

                    Die Gefahren erkennen und ihnen entgegen wirken.

                    Beispielsweise in Deinem Falle überprüfen, daß die Eingabe einer bestimmten Syntax entspricht - Du könntest verbieten, daß bestimmte Zeichen wie String-Terminatoren oder Semikolons über Dein Formular eingegeben werden dürfen.

                    Viele Grüße
                          Michael

                    --
                    T'Pol: I apologize if I acted inappropriately.
                    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                    (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                     => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                    Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
  2. Halihallo Andreas

    '' finde ich ja mittlerweile dank der freundlichen Hilfe des linken Setzers in meiner MySql-DB. Aber nun machen die deutschen Umlaute mir Sorgen:
    wenn ich 'ä' suche (LIKE '%ä%'), bekomme ich zwar auch 'ä', aber auch alle Datensätze mit ''.

    Komisch, wirklich komisch. Habe es auch bei mir gesehen, es scheint sich auf den LIKE
    Operator zu beschränken. REGEXP, sowie '=' funktionieren zumindest.

    Ein kleiner Workaround:

    x LIKE "%ä%" wird:

    (x LIKE BINARY "%ä%" OR x LIKE BINARY "%Ä%")

    Note: UPPER funktioniert nicht mit Umlauten, deshalb das OR und die Klammerung.
    Note: Das BINARY behandelt die Bytes "AS IS", dies scheint das '' Problem zu lösen.

    Ansonsten könnte man eben über REGEXP oder LEFT(x,1)='ä' gehen.

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Halihallo Philipp

      Komisch, wirklich komisch. Habe es auch bei mir gesehen, es scheint sich auf den LIKE
      Operator zu beschränken. REGEXP, sowie '=' funktionieren zumindest.

      Und noch komischer ist das Fakt, dass ö's und ü's nicht davon betroffen sind...
      Zudem ist LEFT(x,1)='ä' davon auch betroffen.

      Wirklich interessant ;)

      Viele Grüsse

      Philipp

      --
      RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
      Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
      1. Halihallo

        Und noch komischer ist das Fakt, dass ö's und ü's nicht davon betroffen sind...
        Zudem ist LEFT(x,1)='ä' davon auch betroffen.
        Wirklich interessant ;)

        und getestet auf: 3.23.49 (Debian-Linux), 3.23.54-nt (WinXP), beide mit de-iso-8859-1

        Viele Grüsse

        Philipp

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
      2. Hi Philipp,

        Und noch komischer ist das Fakt, dass ö's und ü's nicht davon betroffen sind...

        ich vermute, daß auch diese beiden Zeichen zu irgend einem anderen Zeichen kongruent sind, das in Deinem Testfall aber zufällig nicht vorlag.

        Nach dem bisherigen Stand der Dinge kann ich noch nicht unterscheiden, ob wirklich ein Bug vorliegt oder ob die eindeutige Interpretation des 'ä' durch irgendwelche Sprach-Einstellungen (sei es innerhalb der mySQL-Konfiguration oder gar des Shell-Environments) erzwungen werden kann.

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
         => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
        Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
    2. Halihallo Andreas
      auch so,

      Komisch, wirklich komisch. Habe es auch bei mir gesehen, es scheint sich auf den LIKE
      Operator zu beschränken.

      ja, bei mir auch

      Ein kleiner Workaround:

      x LIKE "%ä%" wird:

      (x LIKE BINARY "%ä%" OR x LIKE BINARY "%Ä%")

      Note: UPPER funktioniert nicht mit Umlauten, deshalb das OR und die Klammerung.
      Note: Das BINARY behandelt die Bytes "AS IS", dies scheint das '' Problem zu lösen.

      vielen Dank für den Tip - das scheint mir sehr praktikabel

      Gruß, Andreas