LIKE mit richtige abfragereihenfolge
Toy
- datenbank
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
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
Hi.
kommt auf das jeweilige dbms an, welches du benutzt.
MYSQL!
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
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
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
Danke dir. Ja ich hatte nur versucht beide Wildcards wegzumachen, also das dahinter steht noch.
Danke.
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.
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
Hi.
Das hängt von der Collation ab.
Welche wäre denn die richtige?
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:
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi.
- Typ
- Version
- Create-Statement der abgefragten Tabelle
Aktuelles XAMPP.
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 ;
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
),
KEYTiere
(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>
»» - MySQL
»» - 5.0.51aaktuell 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!
Hello,
»» - MySQL
»» - 5.0.51aaktuell 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
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, dassa13Bzy9 == 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
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";
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
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