UTF8_BIN - Case-Unterscheidung in boolean Fulltext
Jonny 5
- datenbank
0 dedlfix
0 Jonny 5
0 Sven Rautenberg
Hallöle,
ich habe eine Datenbank, die aus Case- und Umlautgründen als utf8_bin vorliegt. (Sie enthält Wörter, aus denen urlencoded Urls generiert werden und im rohen utf8 als Suchbegriffe dienen)
Nun stellt sich das Problem, daß bei einer boolschen Volltext-Suche der Case unterschieden wird (in normalen Modus nicht / bei LIKE - wie erwünscht - wiederum schon) Ich bräuchte aber in bestimmten Fällen in der boolschen Volltext-Variante insensitive Selects.
Könnte man natürlich alle möglichen Variationen aus groß- und kleingeschriebenen Worten in einen Query packen. Bei Strings mit vielen Worten wird das aber für die Performance übel.
+----+-----------------------+
| id | url_words |
+----+-----------------------+
| 1 | Hallo Welt |
+----+-----------------------+
SELECT id,url_words
FROM my_db
WHERE MATCH (url_words) AGAINST ('+hallo +welt' IN BOOLEAN MODE)
0 rows in set (0.00 sec)
Dachte irgendwie an etwas wie collate utf8_general_ci im select, aber da bin ich eventuell auf dem Holzweg. Bzw ist mir nicht klar, wie ich das in den Match Against bauen soll.
herzliche Grüße,
Jonny 5
echo $begrüßung;
ich habe eine Datenbank, die aus Case- und Umlautgründen als utf8_bin vorliegt.[...] Ich bräuchte aber in bestimmten Fällen in der boolschen Volltext-Variante insensitive Selects.
SELECT id,url_words
FROM my_db
WHERE MATCH (url_words) AGAINST ('+hallo +welt' IN BOOLEAN MODE)
Dachte irgendwie an etwas wie collate utf8_general_ci im select, aber da bin ich eventuell auf dem Holzweg. Bzw ist mir nicht klar, wie ich das in den Match Against bauen soll.
Du hast url_words als utf8_bin vorliegen, möchtest es aber als utf8_general_ci haben. In dem Fall würde ich es zunächst mit einer Konvertierung dieser Spalte CONVERT(url_words USING versuchen. Das Handbuch erwähnt sogar diese Methode im Absatz, der mit "Normally, you cannot compare a BLOB value or other binary string in case-insensitive fashion ..." beginnt.
Welcher konkrete Grund veranlasste dich, utf8_bin zu verwenden?
echo "$verabschiedung $name";
Hallo nochmal,
Du hast url_words als utf8_bin vorliegen, möchtest es aber als utf8_general_ci haben. In dem Fall würde ich es zunächst mit einer Konvertierung dieser Spalte CONVERT(url_words USING versuchen. Das Handbuch erwähnt sogar diese Methode im Absatz, der mit "Normally, you cannot compare a BLOB value or other binary string in case-insensitive fashion ..." beginnt.
Damit habe ich schon etwas experimentiert, aber wohl etwas falsch gemacht. Es sollte aber so funktionieren.
Welcher konkrete Grund veranlasste dich, utf8_bin zu verwenden?
Ich habe mich offenbar mißverstänlich ausgedrückt.
Um das ganze etwas zu konkretisieren...
Ich habe eine Tabelle, die aus Worten/Phrasen, teils mit Sonderzeichen und Umlauten besteht. So eine Phrase entspricht, sobald sie urlencoded ist, einer gültigen Url. Die Konvertierung erfolgt direkt von multibyte in urlencoded.
Beispielsweise könnte die Url mit dem Wort 'In würde' auf eine andere Resource, als 'in Würde' oder 'in wurde' zeigen. Ein Unique Index liegt ua über diese Phrasenspalte. Es müssen beide Varianten möglich sein, bei utf8_(general|unicode)_ci funktioniert das ganze nicht, da U=u=Ü=ü usw siehe http://dev.mysql.com/doc/refman/5.1/de/charset-unicode-sets.html
Es wäre möglich, die Urls urlencoded in latin1 zu speichern, wäre mir aber zu aufwendig, da es dann nötig wäre einiges an Funktionen umzuschreiben und Konvertierungen vorzunehmen.
Vielleicht nehme ich aus dem betreffenden Modul die boolsche Suche auch ganz heraus.
Hoffe mich etwas verständlicher ausgedrückt zu haben.
herzliche Grüße nochmal,
Jonny 5
Moin!
ich habe eine Datenbank, die aus Case- und Umlautgründen als utf8_bin vorliegt.
Damit bewirkst du, dass du immer case-sensitiv suchst, und binär sortierst.
Nun stellt sich das Problem, daß bei einer boolschen Volltext-Suche der Case unterschieden wird (in normalen Modus nicht / bei LIKE - wie erwünscht - wiederum schon) Ich bräuchte aber in bestimmten Fällen in der boolschen Volltext-Variante insensitive Selects.
Dann darfst du nicht utf8_bin benutzen.
Abgesehen davon wird hier deine Formulierung, was genau du in welchem Fall brauchst, schon unverständlich. Zuviel Klammersatzbildung, würde ich meinen.
SELECT id,url_words
FROM my_db
WHERE MATCH (url_words) AGAINST ('+hallo +welt' IN BOOLEAN MODE)
Wenn du IN BOOLEAN MODE suchst, ist das case-sensitive. Was aber nicht zu deiner Beschreibung paßt, du würdest case-insensitive haben wollen. Und außerdem nicht dazu paßt, dass du "normal" suchen willst. Verwirrung perfekt.
Bring mal etwas mehr Klarheit in deine Fragen.
- Sven Rautenberg