Toy: LIKE mit richtige abfragereihenfolge

Hallo.

Ich habe eine Tabelle mit sollchen einträge:

Tiere
--------
Hunde
Katzen
Tiger
Kamele
Tintenfische

Ich frage sie so ab:
SELECT Tiere FROM dentieren WHERE Tiere LIKE '%".$tier."%' LIMIT 0,10

So wenn ich also "t" eingebe, bekomme ich einfach nur:
"Katzen"

Ich möchte aber:
"Tiger, Tintenfische"

haben.

Ich möchte aber das die Abfrage Buchstabe für Buchstabe durchgeht und dabei nicht auf Groß und Kleinschreibung achtet.

Wie müsste da die Abfrage lauten?

Gruß,

toy

  1. yo,

    Ich möchte aber das die Abfrage Buchstabe für Buchstabe durchgeht und dabei nicht auf Groß und Kleinschreibung achtet.

    kommt auf das jeweilige dbms an, welches du benutzt.

    Ilja

    1. Hi.

      kommt auf das jeweilige dbms an, welches du benutzt.

      MYSQL!

  2. Hi,

    SELECT Tiere FROM dentieren

    netter Tabellenname. Ist das Lateinisch für "zahnen"?

    So wenn ich also "t" eingebe, bekomme ich einfach nur:
    "Katzen"

    Ich möchte aber:
    "Tiger, Tintenfische"

    haben.

    Dann solltest Du darauf verzichten, eine Wildcard vor dem zu suchenden Buchstaben anzugeben. Das hat den weiteren Vorteil, dass Du nicht mehr die ineffizienteste aller Suchmethoden einsetzt.

    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. Hi.

      Dann solltest Du darauf verzichten, eine Wildcard vor dem zu suchenden Buchstaben anzugeben. Das hat den weiteren Vorteil, dass Du nicht mehr die ineffizienteste aller Suchmethoden einsetzt.

      Also

      weder:
      SELECT Tiere FROM dentieren WHERE Tiere LIKE '%".$tier."%'

      noch:
      SELECT Tiere FROM dentieren WHERE Tiere LIKE '".$tier."'

      noch:
      SELECT Tiere FROM dentieren WHERE Tiere='".$tier."'

      führen zum gewünschten Ergebnis, bitte hilf mir.

      Gruß, Toy

      1. Hi,

        »» Dann solltest Du darauf verzichten, eine Wildcard vor dem zu suchenden Buchstaben anzugeben.
        SELECT Tiere FROM dentieren WHERE Tiere LIKE '%".$tier."%'
        SELECT Tiere FROM dentieren WHERE Tiere LIKE '".$tier."'
        SELECT Tiere FROM dentieren WHERE Tiere='".$tier."'

        Du musst Dich nicht wundern, dass etwas nicht funktioniert, wenn Du anstatt die genannte Lösung umzusetzen die Umsetzung noch weiter veränderst. Lies Dir den von mir genannten Ansatz noch mal durch und mach *nur* das, was darin steht.

        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
    2. Danke dir. Ja ich hatte nur versucht beide Wildcards wegzumachen, also das dahinter steht noch.

      Danke.

  3. So wenn ich also "t" eingebe, bekomme ich einfach nur:
    "Katzen"

    Du bekommst alles wo ein t drin ist. In deinem Fall wären das drei Zeilen, wahrscheinlich liest du nur die erste davon aus und das waren die Katzen.

    1. Hi,

      Du bekommst alles wo ein t drin ist. In deinem Fall wären das drei Zeilen

      Das hängt von der Collation ab.

      MfG ChrisB

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
      1. Hi.

        Das hängt von der Collation ab.

        Welche wäre denn die richtige?

        1. Hello,

          Das hängt von der Collation ab.

          Welche wäre denn die richtige?

          Wie wäre es denn, wenn Du uns nun mal die fehlenden Angaben über das DBMS geben würdest:

          • Typ
          • Version
          • Create-Statement der abgefragten Tabelle

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi.

            • Typ
            • Version
            • Create-Statement der abgefragten Tabelle

            Aktuelles XAMPP.

            • MySQL
            • 5.0.51a
            CREATE TABLE IF NOT EXISTS `dentieren` (  
              `tierid` int(11) NOT NULL AUTO_INCREMENT,  
              `Tiere` varchar(100) COLLATE utf8_bin NOT NULL,  
              PRIMARY KEY (`tierid`),  
              KEY `Tiere` (`Tiere`),  
            ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
            
            1. Hello,

              Hi.

              • Typ
              • Version
              • Create-Statement der abgefragten Tabelle

              Aktuelles XAMPP.

              • MySQL
              • 5.0.51a

              aktuell ist bei Xampp

              mysql> select version();
              +------------------+
              | version()        |
              +------------------+
              | 5.1.33-community |
              +------------------+

              CREATE TABLE IF NOT EXISTS dentieren (

              tierid int(11) NOT NULL AUTO_INCREMENT,
                Tiere varchar(100) COLLATE utf8_bin NOT NULL,
                PRIMARY KEY (tierid),
                KEY Tiere (Tiere),
              ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

                
              Was ich doch sagte:  
                
                  `Tiere` varchar(100) COLLATE utf8\_bin  
                
              ist eine Binary Collation, es wird also jedes Zeichen "as it is" mit seinem Bytewert behandelt und nicht abgebildet auf sein Pendant in Groß- oder Kleinschreibung.  
                
              <http://dev.mysql.com/doc/refman/5.1/en/charset-binary-collations.html>  
                
                
                
                
                
                
                
              Liebe Grüße aus dem schönen Oberharz  
                
                
              Tom vom Berg  
              ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                
              
              -- 
              Nur selber lernen macht schlau  
              <http://bergpost.annerschbarrich.de>
              
              1. »» - MySQL
                »» - 5.0.51a

                aktuell ist bei Xampp

                mysql> select version();
                +------------------+
                | version()        |
                +------------------+
                | 5.1.33-community |
                +------------------+

                Also ich hab eben noch das aktuelle XAMPP heruntergeladen und PHPMYADMIN zeigt mir: MySQL-Client-Version: 5.0.51a an.

                Argh ich Idiot. Habs jetzt geändert in: utf8_unicode_ci
                Und jetzt geht es auch. Danke dir!

                1. Hello,

                  »» - MySQL
                  »» - 5.0.51a

                  aktuell ist bei Xampp

                  mysql> select version();
                  +------------------+
                  | version()        |
                  +------------------+
                  | 5.1.33-community |
                  +------------------+

                  Also ich hab eben noch das aktuelle XAMPP heruntergeladen und PHPMYADMIN zeigt mir: MySQL-Client-Version: 5.0.51a an.

                  Das widerspricht sich doch nicht. Das DBMS hat die Version 5.1.33 (bei mir) und der Client (PHP-API) kann 5.0.51a haben.

                  Argh ich Idiot. Habs jetzt geändert in: utf8_unicode_ci
                  Und jetzt geht es auch. Danke dir!

                  Es kann aber manchmal auch sinnvoll sein, die Spalten so anzulegen. Kommt immer auf den Fall an.
                  Wenn es z.B. eine alphanumerische Schlüsselspalte ist, dann will man oft nicht, dass

                  a13Bzy9 == A13BZy9

                  ist, oder ähnlich

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Es kann aber manchmal auch sinnvoll sein, die Spalten so anzulegen. Kommt immer auf den Fall an.
                    Wenn es z.B. eine alphanumerische Schlüsselspalte ist, dann will man oft nicht, dass

                    a13Bzy9 == A13BZy9

                    ist, oder ähnlich

                    Hm also ich gebe zu ich habe mich mit Kollationen bisher nicht auseinander gesetzt. Ich wähle für alles einfach UTF-8. Und wann sollte ich das binär nutzen? Kannst du mir überhaupt mal den Unterschied erklären?
                    Also wenn ich das richtig verstanden habe:

                    UTF-8 bin = case sensitive
                    UTF-8 unicode = nicht case sensitive

                    Gruß, toy

                    1. echo $begrüßung;

                      Hm also ich gebe zu ich habe mich mit Kollationen bisher nicht auseinander gesetzt. Ich wähle für alles einfach UTF-8.

                      Das ist schon mal keine Kollation sondern eine Kodierung. Die Kollation beschreibt Regeln für das Vergleichen und Groß-/Kleinschreibung. Eine Kollation ist sinnvollerweise mit einem Zeichensatz verbunden, denn die von der Kollation zu berücksichtigenden Zeichen müssen im Zeichensatz enthalten sein. Zeichensatz und Zeichenkodierung werden gern als Synonym verwendet, sind es aber nicht. Der Unterschied kommt deutlich bei Unicode versus UTF-8 zum Vorschein. Da ein Zeichensatz eine eher theoretische Zusammenstellung ist, ein Computer aber etwas physikalisches zum Arbeiten braucht (Zeichen in einer bestimmten Kodierung) und es obendrein noch mehrere Kodierungen für Unicode gibt, verwendet MySQL in seiner Kodierungs- und Kollationsangabe beispielsweise die Zeichenkodierung utf8 und die Kollation general. Hinzu kommt meist noch ci für caseinsensitive. Macht zusammen utf8_general_ci.

                      Und wann sollte ich das binär nutzen? Kannst du mir überhaupt mal den Unterschied erklären?

                      utf8_bin bedeutet, dass die Zeichen in der Kodierung UTF-8 vorliegen, aber keine sprachspezifischen Regeln beim Vergleichen angewendet werden. Casesensitive (cs) Kollationen gibt es auch nur sehr wenige. Wenn du die Groß-/Kleinschreibung berücksichtigen willst, ist also ebenfalls _bin angebracht.

                      echo "$verabschiedung $name";

                  2. Eine weitere Frage habe ich noch dazu:

                    Die Abfrage sieht so aus:

                      
                    SELECT Tiere FROM dentieren WHERE Tiere LIKE '%".$tier."%' ORDER BY(Tiere)
                    

                    1. Wie könnte ich die Abfrage effizienter machen?
                    2. Wie bekomme ich das Ergebnis nach Übereinstimmung mit dem Suchstring sortiert? Also wenn da kommt "t" dann sollen die Tiere die mit "t" beginnen zuerst kommen.

                    Gruß, toy

      2. Hello,

        Du bekommst alles wo ein t drin ist. In deinem Fall wären das drei Zeilen

        Das hängt von der Collation ab.

        Und wie die Spalte definiert wurde. Wenn sie z.B. als Binary definiert wurde (oder vergleichbarer Typ bei anderen DBMS), dann wird sie auch so behandelt bei der Abfrage mit Like.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de