Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problem mit Umlauten beim SELECT

434 views
Skip to first unread message

Monika Nowak

unread,
Oct 20, 2008, 5:04:39 AM10/20/08
to
Hallo,

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

Christian Kirsch

unread,
Oct 20, 2008, 5:50:01 AM10/20/08
to
Monika Nowak schrieb:

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

Claus Reibenstein

unread,
Oct 20, 2008, 5:54:52 AM10/20/08
to
Monika Nowak schrieb:

> 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

Monika Nowak

unread,
Oct 20, 2008, 6:17:16 AM10/20/08
to

> SELECT *
> FROM t1
> WHERE k LIKE _latin1 '%ü%' COLLATE latin1_german2_ci;

Leider eine Fehlermeldung:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and
(latin1_german2_ci,EXPLICIT) for operation 'like'

Monika Nowak

unread,
Oct 20, 2008, 6:22:48 AM10/20/08
to

> Nicht ganz: Es liegt daran, dass Du eine Sortierreihenfolge (COLLATION)
> gewählt hast, die "ü" und "u" gleichsetzt.

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

Sebastian Suchanek

unread,
Oct 20, 2008, 7:20:28 AM10/20/08
to
Monika Nowak schrieb:

>> Nicht ganz: Es liegt daran, dass Du eine Sortierreihenfolge (COLLATION)
>> gewählt hast, die "ü" und "u" gleichsetzt.
>
> Wenn ich die COLLATION in der Spalte auf latin1_german2_ci setze, würde
> es dann richtig ausgegeben?

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

Frank Arthur

unread,
Oct 20, 2008, 7:28:04 AM10/20/08
to
Monika Nowak schrieb:

>
> SELECT * FROM `Tabellenname` WHERE Spaltenname LIKE '%ü%' liefert mir
> alle Einträge die "ü" und "u" enthalten.

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.

Sebastian Suchanek

unread,
Oct 20, 2008, 7:33:39 AM10/20/08
to
Sebastian Suchanek macht die Ingrid:

> Monika Nowak schrieb:
>>>
>>> Nicht ganz: Es liegt daran, dass Du eine Sortierreihenfolge (COLLATION)
>>> gewählt hast, die "ü" und "u" gleichsetzt.
>>
>> Wenn ich die COLLATION in der Spalte auf latin1_german2_ci setze, würde
>> es dann richtig ausgegeben?
>
> Was heißt für Dich "richtig" in diesem Zusammenhang?
>
>> Kann ich dann aber z.B. japanische Texte in dieser Spalte einfügen?
>
> Ja.
> [...]

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

Christian Kirsch

unread,
Oct 20, 2008, 8:11:03 AM10/20/08
to
Frank Arthur 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.

Frank Arthur

unread,
Oct 20, 2008, 8:48:36 AM10/20/08
to
> Frank Arthur schrieb:

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

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.

Frank Arthur

unread,
Oct 20, 2008, 9:43:49 AM10/20/08
to
Claus:

>
>> Versuch's mal mit LIKE '%ü%' COLLATE 'utf8_bin'.
>
> Es werden alle Daten geliefert wie Sonderzeichen enthalte (@, ', * etc.)

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 |
+--------+

Axel Schwenke

unread,
Oct 20, 2008, 5:24:23 PM10/20/08
to
Sebastian Suchanek <seba...@suchanek.de> wrote:
> Sebastian Suchanek macht die Ingrid:
>>
>> Was heißt für Dich "richtig" in diesem Zusammenhang?
>>
>>> Kann ich dann aber z.B. japanische Texte in dieser Spalte einfügen?
>>
>> Ja.
>> [...]
>
> Korrektur: So einfach wohl leider doch nicht, mein Fehler. :-(

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

Axel Schwenke

unread,
Oct 20, 2008, 5:30:47 PM10/20/08
to
Frank Arthur <no.e...@example.com> wrote:
>
> SELECT *
> FROM `t146`
> WHERE `text` LIKE _utf8"%m%" COLLATE "utf8_bin";

Einfacher:

WHERE `text` LIKE BINARY "%m%"


XL

Gerome Muent

unread,
Oct 21, 2008, 4:47:59 AM10/21/08
to
* Axel Schwenke wrote:

> 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

Sebastian Suchanek

unread,
Oct 21, 2008, 7:03:33 AM10/21/08
to
Frank Arthur schrieb:

> [...]


> 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

Claus Reibenstein

unread,
Oct 21, 2008, 8:36:58 AM10/21/08
to
Sebastian Suchanek schrieb:

> 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

0 new messages