verknüpfungin php

verknüpfungin php

am 09.12.2005 14:06:47 von Mathias Fiedler

Hallo NG,

ich möchte eine Abfrage über zwei Tabellen machen. Ich löse das momentan
so:

SELECT tabelle1.wert, tabelle2.wert, tabelle3.wert
FROM tabelle1,tabelle2,tabelle3
WHERE
tabelle1.wert = 1 AND tabelle2.wert = 2 AND tabelle3.wert = 3;

Soweit ok.

Nun soll aber ein Wert aus tabelle1 in Tabelle geprüft werden.

SELECT ....... WHERE tabelle1.wert = tabelle2.wert;

Klappt auch.

Nun noch mit LIKE.

SELECT ...... WHERE tabelle1.wert = tabelle2.wert
AND tabelle2.wert like "%1002%" ;

Klappt auch noch.

Und nun das Problem:

SELECT ...... WHERE tabelle1.wert = tabelle2.wert
AND tabelle2.wert like "%tabelle3.wert%" ;

Klappt nicht, obwohl in tabelle3.wert eben genau 1002 steht. Warum nicht?
Mysql bringt keine Fehlermeldung, nur eben kein Ergebnis. Wie muß ich die
Scheibweise ändern?
Beide Felder sind als varchar definiert.

Mathias

Re: verknüpfung in php

am 09.12.2005 14:19:06 von Christian Kirsch

Mathias Fiedler schrieb:
> Hallo NG,
>
> ich möchte eine Abfrage über zwei Tabellen machen. Ich löse das momentan
> so:
>
> SELECT tabelle1.wert, tabelle2.wert, tabelle3.wert
> FROM tabelle1,tabelle2,tabelle3
> WHERE
> tabelle1.wert = 1 AND tabelle2.wert = 2 AND tabelle3.wert = 3;
>
warum hast Du drei verschiedene Tabellen, wenn Du gleichzeitig Werte
aus jeder von ihnen brauchst? Bzw.: Warum stopfst Du das in *ein* Select?

Das deutet auf ein missglücktes Tabellendesign hin.

> Soweit ok.
>
> Nun soll aber ein Wert aus tabelle1 in Tabelle geprüft werden.
>
> SELECT ....... WHERE tabelle1.wert = tabelle2.wert;
>
> Klappt auch.
>
> Nun noch mit LIKE.
>
> SELECT ...... WHERE tabelle1.wert = tabelle2.wert
> AND tabelle2.wert like "%1002%" ;
>
> Klappt auch noch.

unter der Voraussetzung, dass Dein tabelle1.wert eben irgendwo '1002'
enthält.

>
> Und nun das Problem:
>
> SELECT ...... WHERE tabelle1.wert = tabelle2.wert
> AND tabelle2.wert like "%tabelle3.wert%" ;
>
> Klappt nicht, obwohl in tabelle3.wert eben genau 1002 steht. Warum nicht?

Es klappt mit Sicherheit. Das heißt: Die Datenbank tut genau das, was
Du von ihr willst: Sie liefert Dir alle Einträge, für die in Tabelle 1
und 2 die Spalte 'wert' denselben Eintrag enthält. Dieser muss von der
Form '...tabelle3.wert...' sein. Damit sucht (und *findet*) MySQL z.B.
'tabelle3.wert'
'abcdtabelle3.wert'
'blafaselxxx 90890 tabelle3.wert'
'tabelle3.wert_und sogar dass hier'

Was Du vermutlich *willst*, tut es natürlich nicht. Dazu müsstest Du
eine Zeichenkette erzeugen, die mit '%' beginnt, dann kommt
tabelle3.wert (und eben *nicht* 'tabelle3.wert'!), schließlich wieder
ein '%'. Das kannst Du in der Programmiersprache Deiner Wahl erledigen
(die vermutlich bedauerlicherweise PHP heißt) oder in SQL.

> Mysql bringt keine Fehlermeldung, nur eben kein Ergebnis. Wie muß ich die
> Scheibweise ändern?

scheibchenweise.

Tatsächlich musst Du ein bisschen mehr SQL lernen und Dir überlegen,
was Einträge in einfachen bzw. doppelten Anführungszeichen bedeuten.


> Beide Felder sind als varchar definiert.

Welche "beide"? Da geht's doch schon um drei Felder (jeweils 'wert' in
'tabelle1', 'tabelle2' und 'tabelle3'). Für die Fragestellung ist das
aber irrelevant. Wichtiger ist schon, dass das Suchen mit "like
'%...'" Performancenachteile hat, weil MySQL da keinen Index benutzen
kann. Und man bekommt vermutlich mehr Werte, als man haben möchte.

Re: verknüpfung in php

am 09.12.2005 14:37:06 von Stefan Rybacki

Mathias Fiedler wrote:
> Hallo NG,
>...

> Und nun das Problem:
>
> SELECT ...... WHERE tabelle1.wert = tabelle2.wert
> AND tabelle2.wert like "%tabelle3.wert%" ;

Warum das so ist, siehe Antwort von Christian.

SELECT ...... WHERE tabelle1.wert = tabelle2.wert
AND tabelle2.wert like CONCAT('%',tabelle3.wert,'%')


Bis denn dann
Stefan

> ...
> Mathias

Re: verknüpfung in php

am 09.12.2005 21:14:34 von Mathias Fiedler

Am Fri, 09 Dec 2005 14:37:06 +0100 schrieb Stefan Rybacki:

> Mathias Fiedler wrote:
>> Hallo NG,
>>...
>
>> Und nun das Problem:
>>
>> SELECT ...... WHERE tabelle1.wert = tabelle2.wert
>> AND tabelle2.wert like "%tabelle3.wert%" ;
>
> Warum das so ist, siehe Antwort von Christian.
>
> SELECT ...... WHERE tabelle1.wert = tabelle2.wert
> AND tabelle2.wert like CONCAT('%',tabelle3.wert,'%')
>
>
> Bis denn dann
> Stefan
>
>> ...
>> Mathias

Danke, genau das wars.
Meine Tabellengetsaltung ist schon ok. Es war nur das Concat, was gefehlt
hat. Dazu gleich noch eine Frage:
Wenn ich in der DB groß und kleinscheibung habe (wegen Eingaben von
Kunden),
kann ich dann bei der Abfrage bereits strtoupper verwenden, also z.B. so:

SELECT.... FROM.... WHERE CONCAT(strtoupper(feld2)) = strtoupper($test);

Mathias

Re: verknüpfung in php

am 11.12.2005 14:38:21 von Christian Kirsch

Mathias Fiedler wrote:

> Danke, genau das wars.
> Meine Tabellengetsaltung ist schon ok. Es war nur das Concat, was gefehlt
> hat. Dazu gleich noch eine Frage:
> Wenn ich in der DB groß und kleinscheibung habe (wegen Eingaben von
> Kunden),
> kann ich dann bei der Abfrage bereits strtoupper verwenden, also z.B. so:
>
> SELECT.... FROM.... WHERE CONCAT(strtoupper(feld2)) = strtoupper($test);
>

Probiers doch aus.

Du schaltest damit erfolgreich die Benutzung des Index beim Suchen aus,
aber das macht dir ja sicherlich nix.

Übrigens könntest Du auch rechts ein CONCAT unterbringen. Es tut nichts,
aber es schadet auch nichts, und es erhöht beim Lesen das schöne Gefühl
der Symmetrie.

Re: verknüpfung in php

am 12.12.2005 07:52:28 von Mathias Fiedler

Am Sun, 11 Dec 2005 14:38:21 +0100 schrieb Christian Kirsch:

> Mathias Fiedler wrote:
>
>> Danke, genau das wars.
>> Meine Tabellengetsaltung ist schon ok. Es war nur das Concat, was gefehlt
>> hat. Dazu gleich noch eine Frage:
>> Wenn ich in der DB groß und kleinscheibung habe (wegen Eingaben von
>> Kunden),
>> kann ich dann bei der Abfrage bereits strtoupper verwenden, also z.B. so:
>>
>> SELECT.... FROM.... WHERE CONCAT(strtoupper(feld2)) = strtoupper($test);
>>
>
> Probiers doch aus.
>
> Du schaltest damit erfolgreich die Benutzung des Index beim Suchen aus,
> aber das macht dir ja sicherlich nix.
>
Das hast Du ja toll gesagt. Nur leider bringt das keine Punkte. WEnn in
meiner DB Namen stehen, sagen wir mal z.B. "Hannes", wie bekomme ich es
dann hin, das bereits bei der Abfrage "Hannes" und "hannes" und "hanNes"
berücksichtigt wird? Es können ja bei der Eingabe durchaus mal solche
Kombinationen entstehen. Und ich möchte halt nicht jedesmal einen Fehler
bzw. keine oder eine leere Ausgabe.

Mathias

> Übrigens könntest Du auch rechts ein CONCAT unterbringen. Es tut nichts,
> aber es schadet auch nichts, und es erhöht beim Lesen das schöne Gefühl
> der Symmetrie.

Re: verknüpfung in php

am 12.12.2005 08:29:20 von Christian Kirsch

Mathias Fiedler wrote:
> Am Sun, 11 Dec 2005 14:38:21 +0100 schrieb Christian Kirsch:
>
>
>>Mathias Fiedler wrote:

>>>SELECT.... FROM.... WHERE CONCAT(strtoupper(feld2)) = strtoupper($test);
>>>
>>
>>Probiers doch aus.
>>
>>Du schaltest damit erfolgreich die Benutzung des Index beim Suchen aus,
>>aber das macht dir ja sicherlich nix.
>>
>
> Das hast Du ja toll gesagt. Nur leider bringt das keine Punkte. WEnn in
> meiner DB Namen stehen, sagen wir mal z.B. "Hannes", wie bekomme ich es
> dann hin, das bereits bei der Abfrage "Hannes" und "hannes" und "hanNes"
> berücksichtigt wird? Es können ja bei der Eingabe durchaus mal solche
> Kombinationen entstehen. Und ich möchte halt nicht jedesmal einen Fehler
> bzw. keine oder eine leere Ausgabe.

Aber Du möchtest Leuten Briefe schreiben, in deren Adressfeld ihr Name
flasch geschrieben ist? In meiner Welt braucht man die Daten zu
irgendwas, und da ist dann richtige Schreibung ohnehin erforderlich.

MaW: Du solltest bei der *Eingabe* für leidlich sinnhafte Schreibungen
sorgen. Vornamen, Nachnamen, Straße und Orte fangen hierzulande mit
einem Großbuchstaben an und gehen dann klein weiter.

Re: verknüpfung in php

am 12.12.2005 09:41:02 von Kai Ruhnau

Christian Kirsch wrote:
> Mathias Fiedler wrote:
>
>>Am Sun, 11 Dec 2005 14:38:21 +0100 schrieb Christian Kirsch:
>>
>>
>>
>>>Mathias Fiedler wrote:
>
>
>>>>SELECT.... FROM.... WHERE CONCAT(strtoupper(feld2)) = strtoupper($test);
>>>>
>>>
>>>Probiers doch aus.
>>>
>>>Du schaltest damit erfolgreich die Benutzung des Index beim Suchen aus,
>>>aber das macht dir ja sicherlich nix.
>>>
>>
>>Das hast Du ja toll gesagt. Nur leider bringt das keine Punkte. WEnn in
>>meiner DB Namen stehen, sagen wir mal z.B. "Hannes", wie bekomme ich es
>>dann hin, das bereits bei der Abfrage "Hannes" und "hannes" und "hanNes"
>>berücksichtigt wird? Es können ja bei der Eingabe durchaus mal solche
>>Kombinationen entstehen. Und ich möchte halt nicht jedesmal einen Fehler
>>bzw. keine oder eine leere Ausgabe.
>
>
> Aber Du möchtest Leuten Briefe schreiben, in deren Adressfeld ihr Name
> flasch geschrieben ist? In meiner Welt braucht man die Daten zu
> irgendwas, und da ist dann richtige Schreibung ohnehin erforderlich.
>
> MaW: Du solltest bei der *Eingabe* für leidlich sinnhafte Schreibungen
> sorgen. Vornamen, Nachnamen, Straße und Orte fangen hierzulande mit
> einem Großbuchstaben an und gehen dann klein weiter.


Jein,

Ein Standardgegenbeispiel wären Nachnamen mit Titel: Kai von Ruhnau.
Dort ist es relativ schwierig, eine Großschreibung zu erzwingen oder
automatisch zu erzeugen. Auf der anderen Seite gibt es bei Firmennamen
die eigenwilligsten Groß- und Kleinschreibungen, die üblicherweise
natürlich falsch eingegeben worden sind.
International wird es entsprechend komplexer.

@Mathias

Lies mal die Kapitel zu "Character Set Support", insbesondere die Teile
über Collation. Die, die auf _ci enden, tuen genau das, was du möchtest.

http://dev.mysql.com/doc/refman/5.0/en/charset.html


Grüße
Kai

Re: verknüpfung in php

am 12.12.2005 10:19:26 von Christian Kirsch

Kai Ruhnau schrieb:
> Christian Kirsch wrote:

>>Aber Du möchtest Leuten Briefe schreiben, in deren Adressfeld ihr Name
>>flasch geschrieben ist? In meiner Welt braucht man die Daten zu
>>irgendwas, und da ist dann richtige Schreibung ohnehin erforderlich.
>>
>>MaW: Du solltest bei der *Eingabe* für leidlich sinnhafte Schreibungen
>>sorgen. Vornamen, Nachnamen, Straße und Orte fangen hierzulande mit
>>einem Großbuchstaben an und gehen dann klein weiter.
>
>
>
> Jein,
>
> Ein Standardgegenbeispiel wären Nachnamen mit Titel: Kai von Ruhnau.

'von' ist ein Adelsprädikat. Dr. ist ein Titel.

> Dort ist es relativ schwierig, eine Großschreibung zu erzwingen oder
> automatisch zu erzeugen.

Warum? Die Applikation muss natürlich ein Feld für Vornamen und eins
für Nachnamen anbieten. In ersterem muss jedes Wort mit einem
Großbuchstaben anfangen, außerdem ist nach jedem Bindestrich wieder
ein Großbuchstabe dran (Karl-Heinz etc.).

Im Nachnamensfeld muss im Prinzip auch jedes Wort mit einem
Großbuchstaben beginnen, die Bindestrich-Regel gilt ebenfalls.
Ausnahmen sind eben die Adelsprädikate 'von', 'von und zu', 'de', 'lo'
etc - die müssen kleingeschrieben sein, wenn sie als erstes Wort des
Nachnamens erscheinen. Es mag noch weitere Ausnahmen geben, aber ich
denke schon, dass man das in vernünftige Regeln gießen kann. Für Titel
würde ich ein eigenes Feld einführen, samt Dropdown-Box in der Anwendung.

> Auf der anderen Seite gibt es bei Firmennamen
> die eigenwilligsten Groß- und Kleinschreibungen, die üblicherweise
> natürlich falsch eingegeben worden sind.
> International wird es entsprechend komplexer.
>

Ja. Leider. Man sollte diese albernen Binnenmajuskel einfach
verbieten, das erleichterte vieles.

Re: verknüpfung in php

am 12.12.2005 10:59:56 von Mathias Fiedler

Am Mon, 12 Dec 2005 10:19:26 +0100 schrieb Christian Kirsch:

> Kai Ruhnau schrieb:
>> Christian Kirsch wrote:
>
>>>Aber Du möchtest Leuten Briefe schreiben, in deren Adressfeld ihr Name
>>>flasch geschrieben ist? In meiner Welt braucht man die Daten zu
>>>irgendwas, und da ist dann richtige Schreibung ohnehin erforderlich.
>>>
Nein, das möchte ich nicht. Ich habe in einer DB verschiedene Daten über
Kunden gespeichert. Nun kann ein Kunde eben seine Daten und auch die von
anderen wieder abrufen. Wenn er nun in meiner DB zum Beispiel einen
bestimmten Datensatz an Hand, sagen wir mal des Firmennamens, sucht, gibt
er den namen der Firma im Suchfeld ein. Wenn die Firma jetzt Müller heist,
soll ein Ergebnis auch bei müller ausgegeben werden. Wenn eine Firma den
Namen ManB hat, ist es schon schwer genau diese Konstellation von Groß- und
Kleinschreibung zu treffen, wenn man den Namen nur vom hören kennt. Ich
möchte eben, das dann auch die Eingabe von manb oder MANB zum Erfolg führt.
Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
ist. Und wenn ja, wie?

Mathias

Re: verknüpfung in php

am 12.12.2005 11:03:50 von Kai Ruhnau

Mathias Fiedler wrote:

[immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
> Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
> ist. Und wenn ja, wie?

Meine Antwort dazwischen hattest du gelesen?

Grüße
Kai

Re: verknüpfung in php

am 12.12.2005 11:23:53 von Mathias Fiedler

Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:

> Mathias Fiedler wrote:
>
> [immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>> Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
>> ist. Und wenn ja, wie?
>
> Meine Antwort dazwischen hattest du gelesen?
>
> Grüße
> Kai

Ja, habe ich. Nur leider war das eben nicht das, was ich suchte. Aber ich
habe mittlerweile die Lösung gefunden. Habe zwar die Kleinschreibung
gewählt, aber das ändert ja nichts am Prinzip.

$wert1 = strtolower($wert1);
SELECT .... FROM ..... WHERE LOWER($tabelle.wert) = wert1 ;

Sollte ich mich wirklich so unverständlich ausgedrückt haben, das man
darauf nicht gekommen ist? Dann tuts mir leid.

Mathias

Re: verknüpfung in php

am 12.12.2005 11:34:09 von Kai Ruhnau

Mathias Fiedler wrote:
> Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:
>
>
>>Mathias Fiedler wrote:
>>
>>[immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>>
>>>Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
>>>ist. Und wenn ja, wie?
>>
>>Meine Antwort dazwischen hattest du gelesen?
>>
>>Grüße
>>Kai
>
>
> Ja, habe ich. Nur leider war das eben nicht das, was ich suchte.

Dann hast du nicht verstanden, was es ist. Es ist _exakt_ das, was du
suchst.

Wenn ich bei mir in der Applikation als Suchbegriff 'muller' eingebe
(man beachte die fehlenden ü-Punkte) dann passt das auf sämtliche Groß-
und Kleinschreibungsvarianten von Muller, müLLer und wenn du möchtest
sogar mÜllèr oder MüLléR oder...
Das ganze läuft mit dem Characterset utf8 und der Collation
utf8_general_ci (ci=case insensitive) vollständig innerhalb der
Datenbank ab.

> Aber ich
> habe mittlerweile die Lösung gefunden. Habe zwar die Kleinschreibung
> gewählt, aber das ändert ja nichts am Prinzip.
>
> $wert1 = strtolower($wert1);
> SELECT .... FROM ..... WHERE LOWER($tabelle.wert) = wert1 ;
>
> Sollte ich mich wirklich so unverständlich ausgedrückt haben, das man
> darauf nicht gekommen ist? Dann tuts mir leid.

Nein, wir versuchen bloß, dich vor dieser - entschuldige bitte -
Dummheit zu bewahren.

Die Handbuchseite zur PHP-Funktion strtolower meint dazu:

Note that 'alphabetic' is determined by the current locale. This means
that in i.e. the default "C" locale, characters such as umlaut-A (Ä)
will not be converted.

Grüße
Kai

Re: verknüpfung in php

am 12.12.2005 11:58:48 von Axel Schwenke

Mathias Fiedler wrote:
> Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:
>>
>> [immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>>
>> Meine Antwort dazwischen hattest du gelesen?
>
> Ja, habe ich. Nur leider war das eben nicht das, was ich suchte.

Dann hast du es nicht richtig gelesen. Lies es nochmal.
MySQL *kann* Strings case-insensitiv vergleichen, ganz
ohne UPPER() / LOWER() Orgien.


XL

Re: verknüpfung in php

am 12.12.2005 13:31:04 von Mathias Fiedler

Am Mon, 12 Dec 2005 11:34:09 +0100 schrieb Kai Ruhnau:

> Mathias Fiedler wrote:
>> Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:
>>
>>
>>>Mathias Fiedler wrote:
>>>
>>>[immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>>>
>>>>Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
>>>>ist. Und wenn ja, wie?
>>>
>>>Meine Antwort dazwischen hattest du gelesen?
>>>
>>>Grüße
>>>Kai
>>
>>
>> Ja, habe ich. Nur leider war das eben nicht das, was ich suchte.
>
> Dann hast du nicht verstanden, was es ist. Es ist _exakt_ das, was du
> suchst.
>
> Wenn ich bei mir in der Applikation als Suchbegriff 'muller' eingebe
> (man beachte die fehlenden ü-Punkte) dann passt das auf sämtliche Groß-
> und Kleinschreibungsvarianten von Muller, müLLer und wenn du möchtest
> sogar mÜllèr oder MüLléR oder...
> Das ganze läuft mit dem Characterset utf8 und der Collation
> utf8_general_ci (ci=case insensitive) vollständig innerhalb der
> Datenbank ab.
>
>> Aber ich
>> habe mittlerweile die Lösung gefunden. Habe zwar die Kleinschreibung
>> gewählt, aber das ändert ja nichts am Prinzip.
>>
>> $wert1 = strtolower($wert1);
>> SELECT .... FROM ..... WHERE LOWER($tabelle.wert) = wert1 ;
>>
>> Sollte ich mich wirklich so unverständlich ausgedrückt haben, das man
>> darauf nicht gekommen ist? Dann tuts mir leid.
>
> Nein, wir versuchen bloß, dich vor dieser - entschuldige bitte -
> Dummheit zu bewahren.
>
> Die Handbuchseite zur PHP-Funktion strtolower meint dazu:
>
> Note that 'alphabetic' is determined by the current locale. This means
> that in i.e. the default "C" locale, characters such as umlaut-A (Ä)
> will not be converted.
>
> Grüße
> Kai

Nun, dann habe ich folgendes Problem. Das sieht in der Theorie ja alles
ganz gut aus.

Praktisch war das meine Abfrage:
$mysql_string_suche = $mysql_string_suche."LOWER(ort.ort) = \"$ort\" AND
....
Und die funktioniert.

Nun nach latin1_german2_ci

$mysql_string_suche = $mysql_string_suche."_latin1 ort.ort COLLATE
latin1_german2_ci = \"$ort\" AND ...

Und das funktioniert nicht. Wie soll es denn dann aussehen?

Außerdem habe ich das jetzt so verstanden, das weder php noch mysql die
Umlaute konvertieren. Somit wäre dieser Punkt ja sowiso egal. Da die
meisten Fehler bezüglich Groß-und Kleinschreibung ja am Wortanfang liegen,
würde ledigloich der Fall eines Wortes welches mit einem Umlaut anfängt
betroffen. Mit dieser kleinen Ausnahme könnte ich leben. Nichts desto trotz
hätte ich schon gern die "richtige" Variante. Nur das läuft bei mir halt
nicht. Ich arbeite aber auch noch mit mysql 4. Gibt es genau in diesem
Punkt da einen Unterschied zu mysql 5?

Mathias

Re: verknüpfung in php

am 12.12.2005 13:32:40 von Mathias Fiedler

Am Mon, 12 Dec 2005 11:58:48 +0100 schrieb Axel Schwenke:

> Mathias Fiedler wrote:
>> Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:
>>>
>>> [immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>>>
>>> Meine Antwort dazwischen hattest du gelesen?
>>
>> Ja, habe ich. Nur leider war das eben nicht das, was ich suchte.
>
> Dann hast du es nicht richtig gelesen. Lies es nochmal.
> MySQL *kann* Strings case-insensitiv vergleichen, ganz
> ohne UPPER() / LOWER() Orgien.
>
>
> XL

Was ist an UPPER oder LOWER falsch? Wenn es so schlimm ist, warum gibt es
dann die funktionen?

Mathias

Re: verknüpfung in php

am 12.12.2005 13:57:38 von Christian Kirsch

Mathias Fiedler schrieb:
> Am Mon, 12 Dec 2005 11:34:09 +0100 schrieb Kai Ruhnau:
>
>
>>Mathias Fiedler wrote:
>>
>>>Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:
>>>
>>>
>>>
>>>>Mathias Fiedler wrote:
>>>>
>>>>[immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>>>>
>>>>
>>>>>Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
>>>>>ist. Und wenn ja, wie?
>>>>
>>>>Meine Antwort dazwischen hattest du gelesen?
>>>>
>>>>Grüße
>>>>Kai
>>>
>>>
>>>Ja, habe ich. Nur leider war das eben nicht das, was ich suchte.
>>
>>Dann hast du nicht verstanden, was es ist. Es ist _exakt_ das, was du
>>suchst.
>>
>>Wenn ich bei mir in der Applikation als Suchbegriff 'muller' eingebe
>>(man beachte die fehlenden ü-Punkte) dann passt das auf sämtliche Groß-
>>und Kleinschreibungsvarianten von Muller, müLLer und wenn du möchtest
>>sogar mÜllèr oder MüLléR oder...
>>Das ganze läuft mit dem Characterset utf8 und der Collation
>>utf8_general_ci (ci=case insensitive) vollständig innerhalb der
>>Datenbank ab.
>>
>>
>>>Aber ich
>>>habe mittlerweile die Lösung gefunden. Habe zwar die Kleinschreibung
>>>gewählt, aber das ändert ja nichts am Prinzip.
>>>
>>>$wert1 = strtolower($wert1);
>>>SELECT .... FROM ..... WHERE LOWER($tabelle.wert) = wert1 ;
>>>
>>>Sollte ich mich wirklich so unverständlich ausgedrückt haben, das man
>>>darauf nicht gekommen ist? Dann tuts mir leid.
>>
>>Nein, wir versuchen bloß, dich vor dieser - entschuldige bitte -
>>Dummheit zu bewahren.
>>
>>Die Handbuchseite zur PHP-Funktion strtolower meint dazu:
>>
>>Note that 'alphabetic' is determined by the current locale. This means
>>that in i.e. the default "C" locale, characters such as umlaut-A (Ä)
>>will not be converted.
>>
>>Grüße
>>Kai
>
>
> Nun, dann habe ich folgendes Problem. Das sieht in der Theorie ja alles
> ganz gut aus.
>
> Praktisch war das meine Abfrage:
> $mysql_string_suche = $mysql_string_suche."LOWER(ort.ort) = \"$ort\" AND
> ...
> Und die funktioniert.
>
> Nun nach latin1_german2_ci
>
> $mysql_string_suche = $mysql_string_suche."_latin1 ort.ort COLLATE
> latin1_german2_ci = \"$ort\" AND ...
>

Just for the record: Bitte poste hier kein PHP, sondern ausschließlich
Dinge, die sich in mysql sofort ausprobieren lassen. Nicht jeder
versteht die (Script-)Sprache deiner Wahl.

> Und das funktioniert nicht. Wie soll es denn dann aussehen?
>

Vielleicht ein bisschen 'andersrum'? Andererseits - da ich nicht
weiß, was 'funktioniert nicht' bedeutet, ist es so vielleicht auch
richtig rum.

Die Ausgabe von
SHOW CREATE TABLE ort
hätte hier geholfen. Dito natürlich eine Beschreibung, was
'funktioniert nicht' bedeutet (keine Ausgabe, flasche Ausgabe,
Fehlermeldung, Rechner steht in Flammen?), wie die Collation für
Client, Server, Datenbank, Tabelle etc. eingestellt ist usw usw.

> Außerdem habe ich das jetzt so verstanden, das weder php noch mysql die
> Umlaute konvertieren.

Dann hast Du das flasch verstanden. Von der Konvertierung von Umlauten
war bisher noch nirgendwo die Rede. Es ging schlicht um die
SORTIERUNG, aka Collation. Und da ist es eben so, dass PHP im
Default-Locale die Umlaute nach z sortiert. MySQL schert sich nicht um
das Default-Locale, sondern ... aber das weißt Du ja nach Lektüre des
Handbuchs zum Thema Collation und Characters Sets. Wenn Du in PHP das
Locale so einstellst, wie Du es gerne hättest, dann sortiert es die
Umlaute auch so ein, wie Du das eingestellt hast.

> Somit wäre dieser Punkt ja sowiso egal. Da die
> meisten Fehler bezüglich Groß-und Kleinschreibung ja am Wortanfang liegen,
> würde ledigloich der Fall eines Wortes welches mit einem Umlaut anfängt
> betroffen. Mit dieser kleinen Ausnahme könnte ich leben. Nichts desto trotz
> hätte ich schon gern die "richtige" Variante. Nur das läuft bei mir halt
> nicht. Ich arbeite aber auch noch mit mysql 4. Gibt es genau in diesem
> Punkt da einen Unterschied zu mysql 5?

Nein.

Live-Beispiel zum Nachspielen:

mysql> create table ort ( ort char(20)) character set 'latin1' collate
latin1_german1_ci;
Query OK, 0 rows affected (0,07 sec)

mysql> insert into ort values('Wuppertal');
Query OK, 1 row affected (0,08 sec)

mysql> insert into ort values('Wüppertal');
Query OK, 1 row affected (0,00 sec)

mysql> insert into ort values('WUppertal');
Query OK, 1 row affected (0,00 sec)

mysql> select from ort where ort = 'Wuppertal';
ERROR 1064 (42000): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'from ort where ort = 'Wuppertal'' at line 1
mysql> select * from ort where ort = 'Wuppertal';
+-----------+
| ort |
+-----------+
| Wuppertal |
| Wüppertal |
| WUppertal |
+-----------+
3 rows in set (0,05 sec)


Wenn *das* nicht ist, was Du willst, was willst Du dann?

Re: verknüpfung in php

am 12.12.2005 13:59:23 von Christian Kirsch

Mathias Fiedler schrieb:
>
>
> Was ist an UPPER oder LOWER falsch? Wenn es so schlimm ist, warum gibt es
> dann die funktionen?
>

Um Dich zu verwirren.

Re: verknüpfung in php

am 12.12.2005 14:28:12 von Axel Schwenke

Mathias Fiedler wrote:

> Nun, dann habe ich folgendes Problem.
>
> $mysql_string_suche = $mysql_string_suche."_latin1 ort.ort COLLATE
> latin1_german2_ci = \"$ort\" AND ...

Was soll das sein? SQL ist es jedenfalls nicht.

> Und das funktioniert nicht. Wie soll es denn dann aussehen?

So wie im Handbuch:
http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html

Also: ... WHERE = COLLATE

> Außerdem habe ich das jetzt so verstanden, das weder php noch mysql die
> Umlaute konvertieren.

Falsch. Collations enthalten sehr wohl Sonderregelungen für Umlaute.
Praktisch funktioniert das aber wohl nur für utf8.

> Ich arbeite aber auch noch mit mysql 4. Gibt es genau in diesem
> Punkt da einen Unterschied zu mysql 5?

Collations wurden mit 4.1 eingeführt.


XL

Re: verknüpfung in php

am 12.12.2005 14:51:20 von Axel Schwenke

Mathias Fiedler wrote:
> Am Mon, 12 Dec 2005 11:58:48 +0100 schrieb Axel Schwenke:
>
>> MySQL *kann* Strings case-insensitiv vergleichen, ganz
>> ohne UPPER() / LOWER() Orgien.
>
> Was ist an UPPER oder LOWER falsch? Wenn es so schlimm ist, warum gibt es
> dann die funktionen?

Es ist nichts falsch an den Funktionen. Die Verwendung ist falsch.
Bei Datenbanken geht es darum, Informationen schnell zu finden.
Deswegen gibt es Indizes. Und man schreibt Queries so, daß die
Datenbank Indizes auch benutzen kann. Bei einer Bedingung der Form

WHERE funktion(spalte) = konstante

kann MySQL keinen Index benutzen, sondern muß die Tabelle Zeile für
Zeile durchgehen. Mehr noch: für *jede* Zeile muß funktion() ausge-
wertet werden. Das kann *richtig* teuer (vulgo: langsam) werden.

Deswegen solltest du dir das gar nicht erst angewöhnen.


XL

Re: verknüpfung in php

am 12.12.2005 16:51:19 von Mathias Fiedler

Am Mon, 12 Dec 2005 13:57:38 +0100 schrieb Christian Kirsch:

> Mathias Fiedler schrieb:
>> Am Mon, 12 Dec 2005 11:34:09 +0100 schrieb Kai Ruhnau:
>>
>>
>>>Mathias Fiedler wrote:
>>>
>>>>Am Mon, 12 Dec 2005 11:03:50 +0100 schrieb Kai Ruhnau:
>>>>
>>>>
>>>>
>>>>>Mathias Fiedler wrote:
>>>>>
>>>>>[immernoch die Frage nach großkleinschreibungsmäßig unabhängiger Suche]
>>>>>
>>>>>
>>>>>>Die Frage ist nicht, ob es performanceeinbußen gibt, sondern ob es möglich
>>>>>>ist. Und wenn ja, wie?
>>>>>
>>>>>Meine Antwort dazwischen hattest du gelesen?
>>>>>
>>>>>Grüße
>>>>>Kai
>>>>
>>>>
>>>>Ja, habe ich. Nur leider war das eben nicht das, was ich suchte.
>>>
>>>Dann hast du nicht verstanden, was es ist. Es ist _exakt_ das, was du
>>>suchst.
>>>
>>>Wenn ich bei mir in der Applikation als Suchbegriff 'muller' eingebe
>>>(man beachte die fehlenden ü-Punkte) dann passt das auf sämtliche Groß-
>>>und Kleinschreibungsvarianten von Muller, müLLer und wenn du möchtest
>>>sogar mÜllèr oder MüLléR oder...
>>>Das ganze läuft mit dem Characterset utf8 und der Collation
>>>utf8_general_ci (ci=case insensitive) vollständig innerhalb der
>>>Datenbank ab.
>>>
>>>
>>>>Aber ich
>>>>habe mittlerweile die Lösung gefunden. Habe zwar die Kleinschreibung
>>>>gewählt, aber das ändert ja nichts am Prinzip.
>>>>
>>>>$wert1 = strtolower($wert1);
>>>>SELECT .... FROM ..... WHERE LOWER($tabelle.wert) = wert1 ;
>>>>
>>>>Sollte ich mich wirklich so unverständlich ausgedrückt haben, das man
>>>>darauf nicht gekommen ist? Dann tuts mir leid.
>>>
>>>Nein, wir versuchen bloß, dich vor dieser - entschuldige bitte -
>>>Dummheit zu bewahren.
>>>
>>>Die Handbuchseite zur PHP-Funktion strtolower meint dazu:
>>>
>>>Note that 'alphabetic' is determined by the current locale. This means
>>>that in i.e. the default "C" locale, characters such as umlaut-A (Ä)
>>>will not be converted.
>>>
>>>Grüße
>>>Kai
>>
>>
>> Nun, dann habe ich folgendes Problem. Das sieht in der Theorie ja alles
>> ganz gut aus.
>>
>> Praktisch war das meine Abfrage:
>> $mysql_string_suche = $mysql_string_suche."LOWER(ort.ort) = \"$ort\" AND
>> ...
>> Und die funktioniert.
>>
>> Nun nach latin1_german2_ci
>>
>> $mysql_string_suche = $mysql_string_suche."_latin1 ort.ort COLLATE
>> latin1_german2_ci = \"$ort\" AND ...
>>
>
> Just for the record: Bitte poste hier kein PHP, sondern ausschließlich
> Dinge, die sich in mysql sofort ausprobieren lassen. Nicht jeder
> versteht die (Script-)Sprache deiner Wahl.
>
>> Und das funktioniert nicht. Wie soll es denn dann aussehen?
>>
>
> Vielleicht ein bisschen 'andersrum'? Andererseits - da ich nicht
> weiß, was 'funktioniert nicht' bedeutet, ist es so vielleicht auch
> richtig rum.
>
> Die Ausgabe von
> SHOW CREATE TABLE ort
> hätte hier geholfen. Dito natürlich eine Beschreibung, was
> 'funktioniert nicht' bedeutet (keine Ausgabe, flasche Ausgabe,
> Fehlermeldung, Rechner steht in Flammen?), wie die Collation für
> Client, Server, Datenbank, Tabelle etc. eingestellt ist usw usw.
>
>> Außerdem habe ich das jetzt so verstanden, das weder php noch mysql die
>> Umlaute konvertieren.
>
> Dann hast Du das flasch verstanden. Von der Konvertierung von Umlauten
> war bisher noch nirgendwo die Rede. Es ging schlicht um die
> SORTIERUNG, aka Collation. Und da ist es eben so, dass PHP im
> Default-Locale die Umlaute nach z sortiert. MySQL schert sich nicht um
> das Default-Locale, sondern ... aber das weißt Du ja nach Lektüre des
> Handbuchs zum Thema Collation und Characters Sets. Wenn Du in PHP das
> Locale so einstellst, wie Du es gerne hättest, dann sortiert es die
> Umlaute auch so ein, wie Du das eingestellt hast.
>
>> Somit wäre dieser Punkt ja sowiso egal. Da die
>> meisten Fehler bezüglich Groß-und Kleinschreibung ja am Wortanfang liegen,
>> würde ledigloich der Fall eines Wortes welches mit einem Umlaut anfängt
>> betroffen. Mit dieser kleinen Ausnahme könnte ich leben. Nichts desto trotz
>> hätte ich schon gern die "richtige" Variante. Nur das läuft bei mir halt
>> nicht. Ich arbeite aber auch noch mit mysql 4. Gibt es genau in diesem
>> Punkt da einen Unterschied zu mysql 5?
>
> Nein.
>
> Live-Beispiel zum Nachspielen:
>
> mysql> create table ort ( ort char(20)) character set 'latin1' collate
> latin1_german1_ci;
> Query OK, 0 rows affected (0,07 sec)
>
> mysql> insert into ort values('Wuppertal');
> Query OK, 1 row affected (0,08 sec)
>
> mysql> insert into ort values('Wüppertal');
> Query OK, 1 row affected (0,00 sec)
>
> mysql> insert into ort values('WUppertal');
> Query OK, 1 row affected (0,00 sec)
>
> mysql> select from ort where ort = 'Wuppertal';
> ERROR 1064 (42000): You have an error in your SQL syntax; check the
> manual that corresponds to your MySQL server version for the right
> syntax to use near 'from ort where ort = 'Wuppertal'' at line 1
> mysql> select * from ort where ort = 'Wuppertal';
> +-----------+
>| ort |
> +-----------+
>| Wuppertal |
>| Wüppertal |
>| WUppertal |
> +-----------+
> 3 rows in set (0,05 sec)
>
>
> Wenn *das* nicht ist, was Du willst, was willst Du dann?

Na, das war schon das , was ich wollte. Allerdings auch wieder nicht ganz.
Die Ausgangssituation ist die, das die Tabelle schon da ist. Das Feld ist
declariert als varchar(100). Die Eingaben sind alle geprüft und auch OK.
Einen Eintrag WÜperTHal kann es z.B. nicht geben.

Ich habe nun eine Suche nach genau dem Begriff. Das heist, Suche nach
Müller findet nur Müller. Nicht MÜller, nicht MüLler und auch nicht
Müllerin. Unter ganz besonderen Umständen findet aber eine Suche nach
Ähnlichkeiten statt. Da es da aber eben das Problem der Groß- und
Kleinschreibung gibt reicht LIKE alleine nicht aus. Da hatte ich halt
gehofft, ich konvertiere den gesamten Suchbegriff in Kleinbuchstaben und
mache das Ganze auch mit dem Begriff in der DB. Und zwar während der
Abfrage. Ich möchte nicht erst eine Abfrage starten, alles in ein Array
schreiben, dann konvertieren und dann vergleichen. Wenn ich aber bei der
Erstellung der Tabelle schon die Collation verwende, findet die Abfrage
immer alles. Ich kann nicht mahr für das gleiche Feld zwei unterschiedliche
Suchmöglichkeiten nutzen. Wenn die Collation einmal gesetzt ist, ist doch
eine Suche nach dem genauen Wortlaut nicht mehr möglich. Oder sehe ich das
jetzt schion wieder falsch?

Mathias
Übrigens ist die Verwendung der Scriptsprache dabei vollkommen egeal.

Re: verknüpfung in php

am 16.12.2005 10:38:00 von Adrian

Christian Kirsch schrieb:

Das kannst Du in der Programmiersprache Deiner Wahl erledigen
> (die vermutlich bedauerlicherweise PHP heißt) oder in SQL.

was hast du denn gegen PHP?? :-))
welche Sprache bevorzugst du denn Christian?

Gruß
Adrian

Re: verknüpfung in php

am 16.12.2005 13:05:09 von Fabian Schladitz

Adrian schrieb:
> Christian Kirsch schrieb:
>=20
> Das kannst Du in der Programmiersprache Deiner Wahl erledigen
>=20
>>(die vermutlich bedauerlicherweise PHP heißt) oder in SQL.
>=20
>=20
> was hast du denn gegen PHP?? :-))
> welche Sprache bevorzugst du denn Christian?

Das ist hier Offtopic, bitte klärt das unter euch.
Ich bin aber froh, dass du zumindest bei dieser Nachricht zitiert hast,=20
was bei der Anderen fehlte...

F'up 2 Poster

--=20
Gruss,
Fabian