Chris: Strings vergleichen (Groß- und Kleinschreibung)

Hey ihr,

mein Problem ist, dass ich bei der Registrierung von Mitgliedern in meinem Forum den "Wunsch-Nickname" mit der DB vergleiche, ob da schon so ein Nickname vorhanden ist.

Das Problem ist die Groß- und Kleinschreibung. Ich möchte *nicht*, dass alle Nicks grundsätzlich in lowercase gespeichert werden. Aber zum Abgleich, ob ein Nick schon vorhanden ist, darf natürlich bei der Groß- und Kleinschreibung kein Unterschied gemacht werden.

Gibt es einen MySQL-Befehl, der einen Datensatz abfragt und dabei die Groß- und Kleinschreibung ignoriert? Oder ein Gegenstück zu strtolower() bei PHP?

Ansonsten würde mir nur ein Weg einfallen: Zusätzlich zum eigentlichen Nickname den gleichen Nickname nochmal nur in lowercase in der DB speichern, damit PHP dann dort nachschauen kann, ob ein Nickname schon belegt ist. Aber das sehe ich auch mehr als Notlösung...

Wie löst man sowas? Ideal wäre, wenn ich bei der SQL-Abfrage angeben könnte, dass ich die Spalte nickname in lowercase haben möchte...

Grüße
Chris

  1. Hi,

    Das Problem ist die Groß- und Kleinschreibung. Ich möchte *nicht*, dass alle Nicks grundsätzlich in lowercase gespeichert werden.

    dann stelle dieses Datenbankfeld auf eine als "ci" (case-insensitive) bezeichnete Collation ein und setze einen Unique-Constraint darauf.

    Gibt es einen MySQL-Befehl, der einen Datensatz abfragt und dabei die Groß- und Kleinschreibung ignoriert? Oder ein Gegenstück zu strtolower() bei PHP?

    A propos PHP: Datenbankprobleme haben nicht das geringste mit PHP zu tun.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. dann stelle dieses Datenbankfeld auf eine als "ci" (case-insensitive) bezeichnete Collation ein und setze einen Unique-Constraint darauf.

      Ah wunderbar... hehe, dann hätte ich das jetzt auch verstanden. Und plötzlich ergibt alles einen Sinn... ;-)

      Grüße
      Chris

    2. n'abend,

      dann stelle dieses Datenbankfeld auf eine als "ci" (case-insensitive) bezeichnete Collation ein und setze einen Unique-Constraint darauf.

      (MySQL5) ist denn der Bug bzgl. Umlauten (mit utf8_general_ci) in UNQIUE-Constraints endlich mal behoben worden? ;)

      weiterhin schönen abend...

      --
      Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
      sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
      1. Hello,

        dann stelle dieses Datenbankfeld auf eine als "ci" (case-insensitive) bezeichnete Collation ein und setze einen Unique-Constraint darauf.

        (MySQL5) ist denn der Bug bzgl. Umlauten (mit utf8_general_ci) in UNQIUE-Constraints endlich mal behoben worden? ;)

        Welcher Bug? Könntest Du bitte ein paar Worte darüber verlieren? Oder hast Du eine Bug-Nummer, damit ich nachlesen kann? Möchte da ja nicht ins Messer laufen...

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. n'abend,

          Welcher Bug? Könntest Du bitte ein paar Worte darüber verlieren? Oder hast Du eine Bug-Nummer, damit ich nachlesen kann? Möchte da ja nicht ins Messer laufen...

          Es gab Probleme mit utf8_general_ci Spalten mit UNIQUE-Constraint. Ich weiß nicht mehr genau was das Problem war. Umlaute führeten dazu gegen dir UNIQUE-Constraint zu verstoßen, wo das nicht hätte passieren sollen, resp. an Stellen nicht gegen die Constraint zu verstoßen, wo es hätte passieren sollen.

          Den BugReport konnte ich auf die Schnelle jedoch nicht finden... :/

          weiterhin schönen abend...

          --
          Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
          sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    3. Mahlzeit,

      dann stelle dieses Datenbankfeld auf eine als "ci" (case-insensitive) bezeichnete Collation ein und setze einen Unique-Constraint darauf.

      Alternativ könnte er die Namen auch mit einer Abfrage wie "SELECT foo, bar FROM users WHERE LOWER(nickname) LIKE '%hasimausi%'" überprüfen ...

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Hello,

        dann stelle dieses Datenbankfeld auf eine als "ci" (case-insensitive) bezeichnete Collation ein und setze einen Unique-Constraint darauf.

        Alternativ könnte er die Namen auch mit einer Abfrage wie "SELECT foo, bar FROM users WHERE LOWER(nickname) LIKE '%hasimausi%'" überprüfen ...

        Das ist erstens falsch und zweitens der falsche Weg, denn es würde nicht den Eintrag von CI-Doubletten vermeiden.

        Falsch ist es deshalb, weil "Nusshaseimausi" nicht idnetisch mit "hasimausi" und auch nicht mit "Hasimausischwanz" ist.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Mahlzeit,

          Alternativ könnte er die Namen auch mit einer Abfrage wie "SELECT foo, bar FROM users WHERE LOWER(nickname) LIKE '%hasimausi%'" überprüfen ...

          Das ist erstens falsch und zweitens der falsche Weg, denn es würde nicht den Eintrag von CI-Doubletten vermeiden.

          Ach, Tom. Das habe ich auch nie behauptet. Und das war auch nicht das Problem des OP. Der hat nämlich folgende Frage gestellt:

          Gibt es einen MySQL-Befehl, der einen Datensatz abfragt und dabei die Groß- und Kleinschreibung ignoriert?

          Und genau DAS macht die von mir vorgeschlagene Abfrage. Dass man die natürlich auf die spezifischen Gegebenheiten anpassen muss, versteht sich ja, denke ich ...

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Hi,

            Das ist erstens falsch und zweitens der falsche Weg, denn es würde nicht den Eintrag von CI-Doubletten vermeiden.
            Ach, Tom. Das habe ich auch nie behauptet. Und das war auch nicht das Problem des OP.

            stimmt, das war es nicht. Die Frage ist, warum Du es ihm zu erschaffen versuchst.

            Gibt es einen MySQL-Befehl, der einen Datensatz abfragt und dabei die Groß- und Kleinschreibung ignoriert?
            Und genau DAS macht die von mir vorgeschlagene Abfrage.

            Nein, das macht sie nicht - Tom hat Dir Beispielwerte genannt, die fälschlicherweise erkannt würden. Darüber hinaus ist sowohl LIKE '%...%' als auch WHERE LOWER(...) ein Paradebeispiel dafür, wie man sich die Performance effektiv kaputt macht.

            Dass man die natürlich auf die spezifischen Gegebenheiten anpassen muss, versteht sich ja, denke ich ...

            Dein Code ist allenfalls auf *äußerst* spezifische Begebenheiten anwendbar, da es in fast allen Fällen schlicht und ergreifend komplett daneben ist. Der OP hat IMHO nichts geäußert, was den Schluss zuließe, dass ein dermaßen spezieller Fall gegeben wäre. Somit war Dein Posting nur als schlechtes Beispiel nützlich, dafür aber umso mehr ;-)

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Mahlzeit,

              Somit war Dein Posting nur als schlechtes Beispiel nützlich, dafür aber umso mehr ;-)

              Och menno! ;-)

              Naja, wie schon mal jemand schrieb: niemand und nichts ist überflüssig ...

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
              1. Hi,

                Naja, wie schon mal jemand schrieb: niemand und nichts ist überflüssig ...

                doch: Plasma ;-)

                Cheatah, nach Diktat versteckt

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Chris,

    versuchs doch mal mit "like".

    z.B. select * from benutzer where nick like 'Nickname';

    Gruß, foomaker

    --
    Natürlich glaube ich an die Existenz von Ausserirdischen. Schliesslich gibt es ja auch das PERFEKTE SCRIPT.