Doctype: Wie mache ich meine Abfrage Case sesitive?

Wenn ich aus meiner Datenbank abfrage ob es einen User gibt der "Peter" heisst gibt er mir auch ein true zurück wenn ich nach "PETER", "peter" oder "PeTeR" suche. Ich möchte aber nur wirklich den "Peter".

Ich habe geoogelt. Da fand ich nur immer aussagen "MYSQL ist NICHT Case sensitive"... das kann ich mir aber nicht vorstellen.

ciao

  1. Hi,
    siehe dir den Typ "BLOB" an.

    Markus.

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
  2. yo,

    Ich habe geoogelt. Da fand ich nur immer aussagen "MYSQL ist NICHT Case sensitive"... das kann ich mir aber nicht vorstellen.

    http://dev.mysql.com/doc/mysql/en/cast-functions.html

    Ilja

    1. http://dev.mysql.com/doc/mysql/en/cast-functions.html

      HEisst das konkret das die abfrage jetzt lauten müsste:

      SELECT * FROM usertabelle ORDER BY CAST(username AS CHAR);  ?

      Ein konkretes beispiel wäre nett.

      ciao

      1. hi,

        http://dev.mysql.com/doc/mysql/en/cast-functions.html

        HEisst das konkret das die abfrage jetzt lauten müsste:
        SELECT * FROM usertabelle ORDER BY CAST(username AS CHAR);  ?

        nein, BINARY als stichwort sollte eigentlich schon ausreichen

        Ein konkretes beispiel wäre nett.

        finden sich doch auf der seite, oder?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. ERROR: Standard-Begrüssung #128 not found

          Das Problem hatte ich letztens auch. Leider habe ich es immernoch weil ich es nicht lösen konnte wie es sich dabei mit Sonderzeichen verhält.

          Wenn ich also mal das Beispiel von Doctype aufnehme möchte ich "Peter%" und nicht "Peter5" (schift). Oder hat das keinen unterschied?

          Weil selbst wenn ich jetzt mit dem Binary die abfrage nach "Peter%" mache findet er den nicht. müsste ich da dann das mit dem char benutzen?

          <MFG>
          Sebastian Salzgeber
          </MFG>
          (aka:Indyaner)

          --
          www.indyaner.de
          indyaner[AT]indyaner[DOT]de
          Graphicdesign + Webdesign
          und ach: Pakete werden jetzt mit $_DHL verschickt und nichtmehr mit $_POST =)
          sh:) fo:| ch:{ rl:( br:& n4:~ ie:| mo:? va:{ de:< zu:| fl:) ss:| ls:< js:|
          1. hi,

            Wenn ich also mal das Beispiel von Doctype aufnehme möchte ich "Peter%" und nicht "Peter5" (schift).

            wie meinen?
            hast du den text "Peter%" in der DB stehen, und möchtest nach genau diesem suchen?

            Oder hat das keinen unterschied?
            Weil selbst wenn ich jetzt mit dem Binary die abfrage nach "Peter%" mache findet er den nicht. müsste ich da dann das mit dem char benutzen?

            das hat doch mit BINARY oder nicht absolut nichts zu tun - sondern (falls obige vermutung zutrifft) damit, dass % ein sonderzeichen ist, und somit natürlich maskiert werden muss, wenn es als "normales" % gemeint ist:
            http://dev.mysql.com/doc/mysql/de/string-comparison-functions.html

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. ERROR: Standard-Begrüssung #128 not found

              und zwar möchte ich in mein system die funktion einbauen dass jede art von username benutzt werden kann....
              Doch wie mache ich das nun?

              Ich habe es bisher nur dass usernames von a-zA-Z0-9 angenommen werden. Da ist die abfrage ja kein problem da ich sie mit Binary einfach auf gross und kleinschreibung kontrollieren kann.

              Wenn ich jetzt aber statt einem "Peter" einen (albernen) DaFu€K1ngPeT/% habe müsste ich den genauso finden können.

              Leider gibt mir meine abfrage kein result aus wenn ich nach einem Peter% (testweise mal ganz einfach) suche obwohl ich einen solchen in der DB habe. Liegt wohl daran dass ich mit Binary suche.

              Meine frage also:
              Wie suche ich am besten dass ich einträge finde die sowohl "Peter" wie auch "P€te/" sind?

              Muss ich also jedes Sonderzeichen ein Escape voranstellen (Aus "P€te/" wird "P\€te/\") um es dann mit

              SELECT * FROM usertabelle WHERE BINARY username = '". (USername mit Escape)  ."'

              abzufragen?
              Das Binary müsste ich ja drinne lassen falls dann wirklich jemand kommt der einen normalen username hat und nur "Gabi" heisst.

              Im Grunde will ich einfach nur wie jedes Forum es zulassen jeden x-beliebigen Username benutzen zu könenn sei er noch so blöde und mit sonderzeichen.

              Aber dass ich den username original in die DB speicher ohne jede konvertation in irgenwelche sonderzeichen(%->#4543 z.B.)  ist schon richtig oder?

              <MFG>
              Sebastian Salzgeber
              </MFG>
              (aka:Indyaner)

              --
              www.indyaner.de
              indyaner[AT]indyaner[DOT]de
              Graphicdesign + Webdesign
              und ach: Pakete werden jetzt mit $_DHL verschickt und nichtmehr mit $_POST =)
              sh:) fo:| ch:{ rl:( br:& n4:~ ie:| mo:? va:{ de:< zu:| fl:) ss:| ls:< js:|
              1. hi,

                (special for wahsaga)

                sowas im titel unterlasse bitte.

                Ich habe es bisher nur dass usernames von a-zA-Z0-9 angenommen werden. Da ist die abfrage ja kein problem da ich sie mit Binary einfach auf gross und kleinschreibung kontrollieren kann.

                wenn du von vornherein usernamen mit unterschiedlicher groß-/kleinschreibung als _unterschiedliche_ zulassen willst - dann nutze bitte auch einen spaltentyp/-definition, der dies entsprechend abbildet.

                Wie suche ich am besten dass ich einträge finde die sowohl "Peter" wie auch "P€te/" sind?

                was sollen diese beiden denn noch groß gemeinsam haben?
                sie fangen mit 'P' an, und haben an 3./4. stelle ein 'te'.
                aber warum sollte jemand danach gezielt suchen wollen?
                das beispiel wirkt so sehr an den haaren herbeigezogen, dass man es eigentlich schreien hören müsste.

                Das Binary müsste ich ja drinne lassen falls dann wirklich jemand kommt der einen normalen username hat und nur "Gabi" heisst.

                siehe oben - sorge lieber gleich bei der definition der spalte dafür, dass 'Gabi', 'gabi' und 'GABI' als unterschiedliche werte behandelt werden.

                Im Grunde will ich einfach nur wie jedes Forum es zulassen jeden x-beliebigen Username benutzen zu könenn sei er noch so blöde und mit sonderzeichen.

                jedes forum?
                dieses hier beispielsweise tut das nicht, zitat aus dem registrierungformular:

                Benutzer-Name: (Darf die Zeichen 0-9a-z enthalten und muss mindestens 3 Zeichen lang sein - auf deutsch: Nur Kleinbuchstaben und Zahlen sind erlaubt. Der Benutzer-Name wird zur Authentifizierung verwendet und hat nichts mit dem Namen zu tun, der im Forum bei den Nachrichten erscheint!)

                Aber dass ich den username original in die DB speicher ohne jede konvertation in irgenwelche sonderzeichen(%->#4543 z.B.)  ist schon richtig oder?

                das generelle escapen ist natürlich nach wie vor dringen anzuraten, stichwort sql injections.
                warum du aber irgendwo % als #4543 einsetzen wollen würdest, anstatt es im zweifelsfalle (ggf. manuell) zu escapen wie vorgesehen, leuchtet mir nicht ein.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. ERROR: Standard-Begrüssung #128 not found
                  hi,

                  (special for wahsaga)

                  sowas im titel unterlasse bitte.

                  lalala...

                  Ich habe es bisher nur dass usernames von a-zA-Z0-9 angenommen werden. Da ist die abfrage ja kein problem da ich sie mit Binary einfach auf gross und kleinschreibung kontrollieren kann.

                  wenn du von vornherein usernamen mit unterschiedlicher groß-/kleinschreibung als _unterschiedliche_ zulassen willst - dann nutze bitte auch einen spaltentyp/-definition, der dies entsprechend abbildet.

                  varchar?

                  Wie suche ich am besten dass ich einträge finde die sowohl "Peter" wie auch "P€te/" sind?

                  was sollen diese beiden denn noch groß gemeinsam haben?
                  sie fangen mit 'P' an, und haben an 3./4. stelle ein 'te'.
                  aber warum sollte jemand danach gezielt suchen wollen?
                  das beispiel wirkt so sehr an den haaren herbeigezogen, dass man es eigentlich schreien hören müsste.

                  Du hast es flasch verstanden oder ich aber falsch erklärt:
                  Er soll ja gerade einen unterschied ausmachen. ich will lediglich diese beiden user paralelel verwalten. Ist schwer zu erklären... drück halt ncoh nen spruch.

                  Das Binary müsste ich ja drinne lassen falls dann wirklich jemand kommt der einen normalen username hat und nur "Gabi" heisst.

                  siehe oben - sorge lieber gleich bei der definition der spalte dafür, dass 'Gabi', 'gabi' und 'GABI' als unterschiedliche werte behandelt werden.

                  varchar?... ich weiss es nicht. Es sind nichtmal 10 zeichen mit denen du von 0% auf 100% hilfe kämst.

                  Im Grunde will ich einfach nur wie jedes Forum es zulassen jeden x-beliebigen Username benutzen zu könenn sei er noch so blöde und mit sonderzeichen.

                  jedes forum?
                  dieses hier beispielsweise tut das nicht, zitat aus dem registrierungformular:

                  Ich rede von den grossen Bulletin und PHPBB-Boards. Mann kann auch jedes Wort auf die Goldwage legen.

                  Aber dass ich den username original in die DB speicher ohne jede konvertation in irgenwelche sonderzeichen(%->#4543 z.B.)  ist schon richtig oder?

                  das generelle escapen ist natürlich nach wie vor dringen anzuraten, stichwort sql injections.
                  warum du aber irgendwo % als #4543 einsetzen wollen würdest, anstatt es im zweifelsfalle (ggf. manuell) zu escapen wie vorgesehen, leuchtet mir nicht ein.

                  ich habe das ecpane versucht doch sind die php gegeben funktion zu unausreichend. Ich werde es wohl mit preg_replace setzen müssen.

                  gruß,
                  wahsaga

                  <MFG>
                  Sebastian Salzgeber
                  </MFG>
                  (aka:Indyaner)

                  --
                  www.indyaner.de
                  indyaner[AT]indyaner[DOT]de
                  Graphicdesign + Webdesign
                  und ach: Pakete werden jetzt mit $_DHL verschickt und nichtmehr mit $_POST =)
                  sh:) fo:| ch:{ rl:( br:& n4:~ ie:| mo:? va:{ de:< zu:| fl:) ss:| ls:< js:|
                  1. hi,

                    Er soll ja gerade einen unterschied ausmachen. ich will lediglich diese beiden user paralelel verwalten. Ist schwer zu erklären... drück halt ncoh nen spruch.

                    was soll das?

                    varchar?... ich weiss es nicht. Es sind nichtmal 10 zeichen mit denen du von 0% auf 100% hilfe kämst.

                    nein, http://dev.mysql.com/doc/mysql/de/ hat leider ein paar mehr.

                    Ich rede von den grossen Bulletin und PHPBB-Boards. Mann kann auch jedes Wort auf die Goldwage legen.

                    ich habe das ecpane versucht doch sind die php gegeben funktion zu unausreichend.

                    welche zeichen sie _nicht_ escapen, ist klar definiert.
                    und warum, sollte auch nachvollziehbar sein.

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
                    1. ERROR: Standard-Begrüssung #128 not found
                      hi,

                      Er soll ja gerade einen unterschied ausmachen. ich will lediglich diese beiden user paralelel verwalten. Ist schwer zu erklären... drück halt ncoh nen spruch.

                      was soll das?

                      jugendlicher leichtsinn

                      varchar?... ich weiss es nicht. Es sind nichtmal 10 zeichen mit denen du von 0% auf 100% hilfe kämst.

                      nein, http://dev.mysql.com/doc/mysql/de/ hat leider ein paar mehr.

                      Ich dachte auch eher dass du mir den typ sagst und ich dann umgekehert alles zu diesem typ lese. Also? Magst du mir noch doch nocht den typ sagen?

                      ich habe das ecpane versucht doch sind die php gegeben funktion zu unausreichend.

                      welche zeichen sie _nicht_ escapen, ist klar definiert.
                      und warum, sollte auch nachvollziehbar sein.

                      Ja, die Zeilenrückläufe und zeilenwechsel (\n\r) aber sollte ich dann einfach die addslashes-funktion benutzen und darum dann nochmal ein str_replace setzen. Ich glaube da ist ein preg_replace besser geignet. gerne kannst du mich vom gegenteil überzeugen.

                      <MFG>
                      Sebastian Salzgeber
                      </MFG>
                      (aka:Indyaner)

                      --
                      www.indyaner.de
                      indyaner[AT]indyaner[DOT]de
                      Graphicdesign + Webdesign
                      und ach: Pakete werden jetzt mit $_DHL verschickt und nichtmehr mit $_POST =)
                      sh:) fo:| ch:{ rl:( br:& n4:~ ie:| mo:? va:{ de:< zu:| fl:) ss:| ls:< js:|
                      1. hi,

                        Ich dachte auch eher dass du mir den typ sagst und ich dann umgekehert alles zu diesem typ lese. Also? Magst du mir noch doch nocht den typ sagen?

                        http://dev.mysql.com/doc/mysql/de/char.html:
                        "Werte in CHAR- und VARCHAR-Spalten werden unabhängig von der Groß-/Kleinschreibung sortiert und verglichen, es sei denn, beim Erzeugen der Tabelle wurde das BINARY-Attribut festgelegt. Das BINARY-Attribut bedeutet, dass Spaltenwerte abhängig von der Groß-/Kleinschreibung in Übereinstimmung mit der ASCII-Reihenfolge der Maschine sortiert und verglichen werden, auf der der MySQL-Server läuft. BINARY beeinflusst nicht, wie die Spalte gespeichert oder abgerufen wird."

                        http://dev.mysql.com/doc/mysql/de/blob.html:
                        "Der einzige Unterschied zwischen BLOB- und TEXT-Typen ist, dass beim Sortieren und Vergleichen bei BLOB-Werten Groß-/Kleinschreibung berücksichtigt wird, bei TEXT-Werten dagegen nicht. Mit anderen Worten ist ein TEXT ein BLOB ohne Berücksichtigung der Groß-/Kleinschreibung."

                        Ja, die Zeilenrückläufe und zeilenwechsel (\n\r) aber sollte ich dann einfach die addslashes-funktion benutzen und darum dann nochmal ein str_replace setzen.

                        nein.
                        mysql_real_escape_string() ist die funktion, die dafür gedacht ist, daten vor dem einfügen in eine query abzusichern.
                        eine andere dafür zu nehmen, wäre widersinnig - selbst wenn diese auf den ersten blick fast das gleiche zu leisten scheint (und auch das nur auf _derzeitigem_ stand).

                        Ich glaube da ist ein preg_replace besser geignet. gerne kannst du mich vom gegenteil überzeugen.

                        dass man für einfache zeichenersetzungen _kein_ preg nehmen sollte, sollte bekannt sein.
                        sowas können die einfachen stringfunktionen ressourcenschonender.

                        gruß,
                        wahsaga

                        --
                        /voodoo.css:
                        #GeorgeWBush { position:absolute; bottom:-6ft; }
            2. echo $begrueszung;

              ... dass % ein sonderzeichen ist, und somit natürlich maskiert werden muss, wenn es als "normales" % gemeint ist:

              Aber nur (gleiches gilt für _ ), wenn es mit LIKE verwendet werden soll. Im normalen String-Gebrauch ist das maskieren nicht notwendig (Usernamen sollte man für Authentifizierungs-Prozesse nicht mit LIKE vergleichen (-; ). Auch mysql_real_escape_string() hätte arge Schwierigkeiten, das folgende "richtig" zu escapen:

              $name = "Dav'id_";

              $sql = 'select "Dav'id_" LIKE '' . mysql_real_escape_string($name) ."' ESCAPE '|'";

              http://dev.mysql.com/doc/mysql/de/string-comparison-functions.html

              ebenda.

              echo "$verabschiedung $name";

              1. hi,

                Auch mysql_real_escape_string() hätte arge Schwierigkeiten, das folgende "richtig" zu escapen:

                $name = "Dav'id_";

                dass sich mysql_real_escape_string() für _ und % gar nicht zuständig fühlt, sagt ja auch das manual recht deutlich.

                und es dürfte auch in den allermeisten fällen kaum sinnvoll sein, wenn es das täte.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. echo $begrueszung;

                  dass sich mysql_real_escape_string() für _ und % gar nicht zuständig fühlt, sagt ja auch das manual recht deutlich.

                  Eben.
                  Ich verstehe ja nur nicht, wie du da einen Zusammenhang zwischen der Maskierung von %/_ und einem _Vergleich_auf_Gleichheit_ mit einem Wert, in dem diese Zeichen vorkommen können sollen, siehst.

                  echo "$verabschiedung $name";

                  1. hi,

                    Eben.
                    Ich verstehe ja nur nicht, wie du da einen Zusammenhang zwischen der Maskierung von %/_ und einem _Vergleich_auf_Gleichheit_ mit einem Wert, in dem diese Zeichen vorkommen können sollen, siehst.

                    den sehe ich dann, wenn nicht auf exakte gleichheit abgefragt wird - sondern mit LIKE auf übereinstimmungen unter einbeziehung der wildcards.
                    (gut, passt damit vielleicht nicht so gut zum beispiel einer abfrage des usernamens, die ja idR. schon auf gleichheit sein sollte.)

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. yo,

        SELECT * FROM usertabelle ORDER BY CAST(username AS CHAR);  ?

        versuch mal...

        SELECT * FROM usertabelle ORDER BY BINARY username;

        Ilja