SELECT * FROM `Tabellenname` WHERE Spaltenname LIKE '%ü%'
liefert mir alle Einträge die "ü" und "u" enthalten. Wie ich vermute, es
liegt daran, dass alles auf utf8 umgestellt wurde
(siehe dazu:
http://dev.mysql.com/doc/refman/4.1/en/charset-collation-effect.html)
Da ich in der Tabelle auch exotische Sprachen habe, muss utf-8 bleiben,
gerne möchte ich aber, dass solche Abfragen wie oben ausschließlich
Einträge mit "ü" liefern. Lässt sich das irgendwie realisieren?
Gruß
Monika
Das dürfte davon abhängen, welche Collation Du eingestellt hast, sagt
das Handbuch auch. Unterschiedlich würde MySQL "u" und "ü" nur
behandeln, wenn Du "german2_ci" wähltest. Das kannst Du (wg.
UTF8-Erfordernissen) nicht global für die Spalte aber doch für die
Abfrage machen:
http://dev.mysql.com/doc/refman/4.1/en/charset-collate.html
Ist natürlich die Frage, ob Du in der Anwendung sinnvoll entscheiden
kannst, wann Du
SELECT *
FROM t1
WHERE k LIKE _latin1 '%ü%' COLLATE latin1_german2_ci;
schreibst und wann nicht :-( Und wie Du z.B. ù oder ú sortieren möchtest
... Ich fürchte, die Büchse der Pandora ist im Vergleich mit deinem
Problem eine recht kuschelige Angelegenheit
> SELECT * FROM `Tabellenname` WHERE Spaltenname LIKE '%ü%'
> liefert mir alle Einträge die "ü" und "u" enthalten. Wie ich vermute, es
> liegt daran, dass alles auf utf8 umgestellt wurde
Nicht ganz: Es liegt daran, dass Du eine Sortierreihenfolge (COLLATION)
gewählt hast, die "ü" und "u" gleichsetzt.
> Da ich in der Tabelle auch exotische Sprachen habe, muss utf-8 bleiben,
> gerne möchte ich aber, dass solche Abfragen wie oben ausschließlich
> Einträge mit "ü" liefern. Lässt sich das irgendwie realisieren?
Versuch's mal mit LIKE '%ü%' COLLATE 'utf8_bin'.
Gruß. Claus
Leider eine Fehlermeldung:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and
(latin1_german2_ci,EXPLICIT) for operation 'like'
Wenn ich die COLLATION in der Spalte auf latin1_german2_ci setze, würde
es dann richtig ausgegeben? Kann ich dann aber z.B. japanische Texte in
dieser Spalte einfügen?
> Versuch's mal mit LIKE '%ü%' COLLATE 'utf8_bin'.
Es werden alle Daten geliefert wie Sonderzeichen enthalte (@, ', * etc.)
Gruß
Monika
Was heißt für Dich "richtig" in diesem Zusammenhang?
> Kann ich dann aber z.B. japanische Texte in dieser Spalte einfügen?
Ja.
Du darfst "CHARACTER SET" nicht mit "COLLATION" verwechseln. Der
Zeichensatz ("Character Set") einer Spalte bestimmt, grob gesagt, welche
Zeichen überhaupt in diese Spalte kommen dürfen bzw. können.
Die Kollation ("Collation") sagt nur etwas darüber aus, wie die
Ergebnisse einer Abfrage sortiert werden, also z.B., wie sich "u" und
"ü" zueinander verhalten.
Allerdings scheint MySQL bestimmte Kombinationen von Zeichensatz und
Kollationen (z.B. Unicode vs. Non-Unicode) von sich aus auszuschließen.
Tschüs,
Sebastian
Lies mal in der MySQL-Dokumentation weiter zum Thema callations. Soweit
ich mich erinnere, kannst du auch die collations direkt bei der Abfrage
angeben und bekommst dann das gewünschte Ergebnis.
Korrektur: So einfach wohl leider doch nicht, mein Fehler. :-(
MySQL erlaubt definitiv keine Kombination aus Unicode-Zeichensätzen und
Non-Unicode-Kollationen.
Von daher ein interessantes Problem, das Du da angeschnitten hast, jetzt
bin ich selbst gespannt, ob's dafür eine Lösung gibt. :-)
Tschüs,
Sebastian
Lies mal weiter in diesem Thread, und Du wirst feststellen, dass wir
genau da schon waren und das genau das eben in diesem Kontext mit einer
Fehlermeldung quittiert wird.
Christian Kirsch schrieb:
>
> Lies mal weiter in diesem Thread, und Du wirst feststellen, dass wir
> genau da schon waren und das genau das eben in diesem Kontext mit einer
> Fehlermeldung quittiert wird.
Jupp, sorry.
Eure Antworten waren noch nicht da, als das geschrieben hatte.
Dann machst du bestimmt an einer anderen Stelle etwas falsch.
Hier ein Beispiel mit dem Unterschied von 'M' und 'm':
CREATE TABLE IF NOT EXISTS `t146` (
`text` varchar(255) character set utf8 NOT NULL,
PRIMARY KEY (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO `t146`
(`text`)
VALUES ('Mull')
, ('Pummel')
, ('R''eis')
, ('T@xx')
, ('X*ff');
SELECT *
FROM `t146`
WHERE `text` LIKE "%m%";
+--------+
| text |
+--------+
| Mull |
| Pummel |
+--------+
SELECT *
FROM `t146`
WHERE `text` LIKE _utf8"%m%" COLLATE "utf8_bin";
+--------+
| text |
+--------+
| Pummel |
+--------+
MySQLs Unterstützung von Unicode ist auf die erste Version von Unicode
beschränkt, also die ersten 65536 Code points.
Keine Ahnung, ob Japanisch da schon dabei ist. Vermutlich nicht.
> MySQL erlaubt definitiv keine Kombination aus Unicode-Zeichensätzen und
> Non-Unicode-Kollationen.
Tatsächlich speichert MySQL den Zeichensatz gar nicht separat, sondern
nur die Nummer der Collation. Der Zeichensatz ist dann implizit.
XL
Einfacher:
WHERE `text` LIKE BINARY "%m%"
XL
> MySQLs Unterstützung von Unicode ist auf die erste Version von Unicode
> beschränkt, also die ersten 65536 Code points.
> Keine Ahnung, ob Japanisch da schon dabei ist. Vermutlich nicht.
Klar ist Japanisch dabei. So exotisch ist das doch nicht im Vergleich zu
zB. Devanagari etc. was auch alles drin ist.
4E00ff. sind die CJK-Symbole, die die beiden chin. System BIG5 und
GB2312, das Koreanische und das Japanische abdecken.
Gruß, Gérôme
--
BM Computer-Services Schwedenstr. 13
Webdesign 13357 Berlin
Internet Tel.: 030/20649400, mobil 0175/7419517
Layout
Grafik Web: http://www.bmservices.de
Programmierung eMail: kon...@bmservices.de
> [...]
> SELECT *
> FROM `t146`
> WHERE `text` LIKE _utf8"%m%" COLLATE "utf8_bin";
Vorsicht, das kann zu anderen, möglicherweise höchst unerwünschten
Effekten führen, wenn man es auf die Sortierung anwendet:
SELECT * FROM umlaute ORDER BY name COLLATE utf8_general_ci;
5 MAYER
3 Meier
9 Mueller
1 Muller
2 Müller
6 MX
4 MySQL
SELECT * FROM umlaute ORDER BY name COLLATE utf8_bin;
5 MAYER
6 MX
3 Meier
9 Mueller
1 Muller
4 MySQL
2 Müller
Zumindest MySQL >5.0 kommt aber mit Statements der Art
SELECT name
FROM umlaute
WHERE name LIKE '%ü%' COLLATE utf8_bin
ORDER BY name COLLATE utf8_general_ci
klar. Falls man Case-Insensitivity wieder mit einbauen möchte, dann eben
sowas:
SELECT name
FROM umlaute
WHERE LOWER(name) LIKE '%ü%' COLLATE utf8_bin
ORDER BY name COLLATE utf8_general_ci
Tschüs,
Sebastian
> Frank Arthur schrieb:
>
>> WHERE `text` LIKE _utf8"%m%" COLLATE "utf8_bin";
>
> Vorsicht, das kann zu anderen, möglicherweise höchst unerwünschten
> Effekten führen, wenn man es auf die Sortierung anwendet:
Deine Ausführungen sind zwar allesamt richtig, so weit ich das beim
kurzen Draufschauen feststellen konnte, gehen aber leider komplett am
Thema dieses Threads vorbei.
> SELECT * FROM umlaute ORDER BY name COLLATE utf8_general_ci;
Darum ging es aber nicht.
Gruß. Claus