Problem mit COLLATION: Sortieren von Umlauten

Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 08:49:42 von Bernhard Berger

Hallo!

Ich möchte in meiner MySQL-Datenbank die deutschen Umlaute korrekt sortiert
haben.

Habe zuerst per "ALTER DATBASE blah COLLATION latin1_german2_ci", probiert
umzustellen, dann bei jeder Tabelle. Leider werden aber die Umlaute
weiterhin bei der Sortierung ignoriert und kommen ganz am Ende hin. :-o

Nur wenn ich *einzelne* Textfelder auf "COLLATION latin1_german2_ci"
umstelle, zeigt das Wirkung beim Sortieren. Da die Datenbank inwzischen
sehr groß ist, wäre es allerdings ein riesen aufwand wenn ich bei jedes
einzelne Textfeld umstellen muss.

Ein
SHOW VARIABLES LIKE '%collation%';
ergibt übrigens:
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_german2_ci |
| collation_server | latin1_german2_ci |
+----------------------+-------------------+

Auf die Server-Einstellungen habe ich leider keinen Zugriff, kann aber die
Datenbank beliebig ändern.

Hat jemand eine Lösung, wie ich in der ganzen Datenbank die
Umlaut-Sortierung umstellen kann?

mfg,
Bernhard

Re: Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 09:13:57 von Christian Kirsch

Am 01.02.2007 08:49 schrieb Bernhard Berger:
> Hallo!
>
> Ich möchte in meiner MySQL-Datenbank die deutschen Umlaute korrekt sortiert
> haben.
>
> Habe zuerst per "ALTER DATBASE blah COLLATION latin1_german2_ci", probiert
> umzustellen, dann bei jeder Tabelle. Leider werden aber die Umlaute
> weiterhin bei der Sortierung ignoriert und kommen ganz am Ende hin. :-o
>
> Nur wenn ich *einzelne* Textfelder auf "COLLATION latin1_german2_ci"
> umstelle, zeigt das Wirkung beim Sortieren. Da die Datenbank inwzischen
> sehr groß ist, wäre es allerdings ein riesen aufwand wenn ich bei jedes
> einzelne Textfeld umstellen muss.
>

Sowas lässt sich eigentlich relativ trivial mit einem Skript
bewältigen: Aus Information_schema alle Char/Varchar-Spalten rausholen
und dann die geeigneten ALTER TABLE-Statements aufbauen

> Ein
> SHOW VARIABLES LIKE '%collation%';
> ergibt übrigens:
> +----------------------+-------------------+
> | Variable_name | Value |
> +----------------------+-------------------+
> | collation_connection | latin1_swedish_ci |
> | collation_database | latin1_german2_ci |
> | collation_server | latin1_german2_ci |
> +----------------------+-------------------+
>
> Auf die Server-Einstellungen habe ich leider keinen Zugriff, kann aber die
> Datenbank beliebig ändern.

Interessant wäre natürlich, was ein
SHOW CREATE TABLE
für die fraglichen Tabellen sagt. Deine Beschreibung deutet darauf
hin, dass dort noch eine andere Collation steht.

Re: Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 09:21:36 von Bernhard Berger

Christian Kirsch wrote:

>> Nur wenn ich *einzelne* Textfelder auf "COLLATION latin1_german2_ci"
>> umstelle, zeigt das Wirkung beim Sortieren. Da die Datenbank inwzischen
>> sehr groß ist, wäre es allerdings ein riesen aufwand wenn ich bei jedes
>> einzelne Textfeld umstellen muss.
>
> Sowas lässt sich eigentlich relativ trivial mit einem Skript
> bewältigen: Aus Information_schema alle Char/Varchar-Spalten rausholen
> und dann die geeigneten ALTER TABLE-Statements aufbauen

Ok danke. Naja, wenns aber irgendeine andere Möglichkeit gibt, würd ich das
trotzdem gerne umgehen. Wozu kann man denn dann überhaupt eine COLLATION
für eine Datenbank/Tabelle angeben, wenn es nur bei einzelnen Felder dann
zur Wirkung kommt?!

> Interessant wäre natürlich, was ein
> SHOW CREATE TABLE
> für die fraglichen Tabellen sagt. Deine Beschreibung deutet darauf
> hin, dass dort noch eine andere Collation steht.

Hm, da kommt dann z.B.
REATE TABLE `testtabelle` (
vieleVieleViiiieleFelder...
) ENGINE=MyISAM AUTO_INCREMENT=71689 DEFAULT CHARSET=latin1
COLLATE=latin1_german1_ci

Hm, von dem her müsste die Sortierung ja passen?

mfg,
Bernhard

Re: Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 09:27:51 von Christian Kirsch

Am 01.02.2007 09:21 schrieb Bernhard Berger:
> Christian Kirsch wrote:

>> Interessant wäre natürlich, was ein
>> SHOW CREATE TABLE
>> für die fraglichen Tabellen sagt. Deine Beschreibung deutet darauf
>> hin, dass dort noch eine andere Collation steht.
>
> Hm, da kommt dann z.B.
> REATE TABLE `testtabelle` (
> vieleVieleViiiieleFelder...
> ) ENGINE=MyISAM AUTO_INCREMENT=71689 DEFAULT CHARSET=latin1
> COLLATE=latin1_german1_ci
>
> Hm, von dem her müsste die Sortierung ja passen?

Von dem her würde ich einen gelegentlichen Blick in den Zwiebelfisch
empfehlen. Abgesehen davon ist, wenn das hier wirklich die AUSGABE von
SHOW CREATE TABLE sein soll, dein MySQL kapott. Oder dein Cut&Paste.
Bei mir jedenfalls wirft das Kommando für *jedes* Feld die genaue
Definition aus. Und wenn da ein "COLLATE=latin1_swedish" drinsteht,
dann... Aber wem sag' ich das.

Re: Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 09:34:16 von Bernhard Berger

Christian Kirsch wrote:

> Am 01.02.2007 09:21 schrieb Bernhard Berger:
>> Hm, da kommt dann z.B.
>> CREATE TABLE `testtabelle` (
>> vieleVieleViiiieleFelder...
>> ) ENGINE=MyISAM AUTO_INCREMENT=71689 DEFAULT CHARSET=latin1
>> COLLATE=latin1_german1_ci
>>
>> Hm, von dem her müsste die Sortierung ja passen?
>
> Von dem her würde ich einen gelegentlichen Blick in den Zwiebelfisch
> empfehlen. Abgesehen davon ist, wenn das hier wirklich die AUSGABE von
> SHOW CREATE TABLE sein soll, dein MySQL kapott. Oder dein Cut&Paste.
> Bei mir jedenfalls wirft das Kommando für *jedes* Feld die genaue
> Definition aus. Und wenn da ein "COLLATE=latin1_swedish" drinsteht,
> dann... Aber wem sag' ich das.

Ok, natürlich ist die genaue Ausgabe viiiiel länger aber es kommt nirgends
in den Felddefinition der Text "COLLATE" vor, deswegen habe ich die
Feldefinition ausgelassen.
z.B.:

CREATE TABLE `testtabelle` (
`sperrdatumTxt` varchar(255) character set latin1 NOT NULL default '',
`interneNotiz` varchar(255) character set latin1 NOT NULL default '',
etc. etc. etc.
) ENGINE=MyISAM AUTO_INCREMENT=71689 DEFAULT CHARSET=latin1
COLLATE=latin1_german1_ci

Re: Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 10:48:20 von Christian Kirsch

Am 01.02.2007 09:34 schrieb Bernhard Berger:
> Christian Kirsch wrote:
>
>> Am 01.02.2007 09:21 schrieb Bernhard Berger:
>>> Hm, da kommt dann z.B.
>>> CREATE TABLE `testtabelle` (
>>> vieleVieleViiiieleFelder...
>>> ) ENGINE=MyISAM AUTO_INCREMENT=71689 DEFAULT CHARSET=latin1
>>> COLLATE=latin1_german1_ci
>>>
>>> Hm, von dem her müsste die Sortierung ja passen?
>> Von dem her würde ich einen gelegentlichen Blick in den Zwiebelfisch
>> empfehlen. Abgesehen davon ist, wenn das hier wirklich die AUSGABE von
>> SHOW CREATE TABLE sein soll, dein MySQL kapott. Oder dein Cut&Paste.
>> Bei mir jedenfalls wirft das Kommando für *jedes* Feld die genaue
>> Definition aus. Und wenn da ein "COLLATE=latin1_swedish" drinsteht,
>> dann... Aber wem sag' ich das.
>
> Ok, natürlich ist die genaue Ausgabe viiiiel länger aber es kommt nirgends
> in den Felddefinition der Text "COLLATE" vor, deswegen habe ich die
> Feldefinition ausgelassen.
> z.B.:
>
> CREATE TABLE `testtabelle` (
> `sperrdatumTxt` varchar(255) character set latin1 NOT NULL default '',
> `interneNotiz` varchar(255) character set latin1 NOT NULL default '',
> etc. etc. etc.
> ) ENGINE=MyISAM AUTO_INCREMENT=71689 DEFAULT CHARSET=latin1
> COLLATE=latin1_german1_ci

Erstmal zum Fachlichen:
http://dev.mysql.com/doc/refman/5.0/en/charset-mysql.html verrät Dir,
dass die default Collation für latin1 swedish ist. Außerdem verrät Dir
die weitere Lektüre dieses Kapitels, dass ein Character set auf einer
Spalte *ohne* zusätzliche Collation für diese Spalte die
Default-Collation dieses Charsets (!!!) einstellt. Woraus wir jetzt
lernen, dass die Collation für sperrdatumTxt eben swedish ist.
Charset und Collation für die *Tabelle* greifen nur für solche Felder,
für die diese Werte nicht ausdrücklich gesetzt sind. Weiterhin gelten
Charset/Collation der Database nur für die Tabellen, für die sie nicht
ausdrücklich gesetzt sind. MaW: Die Collation dieser beiden Felder
(und vielleicht aller anderen) ist ohnehin swedish.
Jetzt kommt ein kleiner Test:

create table bla (name char(20) character set latin1)
character set latin1 collate latin1_german1_ci;
INSERT ...
mysql> SELECT * from bla;
+--------+
| name |
+--------+
| Müller |
| Mzller |
| Myller |
| Mäller |
| Maller |
+--------+
5 rows in set (0,00 sec)

.... das ist gänzlich unsortiert.

Und jetzt ein
mysql> select * from bla order by name;
+--------+
| name |
+--------+
| Maller |
| Müller |
| Myller |
| Mzller |
| Mäller |
+--------+
5 rows in set (0,00 sec)

Sieht schon sortierter aus - aber nicht unbedingt nach 'german';

Hingegen liefert Dir
mysql> select name from bla order by name collate latin1_german1_ci;
+--------+
| name |
+--------+
| Mäller |
| Maller |
| Müller |
| Myller |
| Mzller |
+--------+

Jetzt zum weniger Fachlichen: All das lässt sich durch LESEN des
Handbuchs herausfinden sowie durch ein bisschen Experimentieren.
Beides habe *ich* getan (denn wer weiß denn schon aus dem Kopf, wie
das alles zusammenhängt), obwohl ich Dein Problem nicht habe. Was hast
*Du* getan?

Du hast eine Frage gestellt und von Dir aus nur die Hälfte der nötigen
Infos geliefert. Auf Nachfrage kam dann nicht etwas die andere Hälfte,
sondern von Dir nach eigenem Gusto gekürzte Daten:

> Ok, natürlich ist die genaue Ausgabe viiiiel länger aber es kommt
> nirgends in den Felddefinition der Text "COLLATE" vor, deswegen habe
> ich die Feldefinition ausgelassen.

Sehr hübsch. Denn gerade *dass* da das Wort Collation nicht vorkam,
war ja entscheidend. Was denkst Du, warum man Dich nach bestimmten
Informationen fragt? Was meinst Du, welchen Anteil *Du* und welchen
andere an der Lösung *Deiner* Probleme haben sollten? Was meinst Du,
wozu es sowas wie eine Dokumentation gibt?

Re: Problem mit COLLATION: Sortieren von Umlauten

am 01.02.2007 11:13:33 von Axel Schwenke

Bernhard Berger wrote:
>
> Wozu kann man denn dann überhaupt eine COLLATION
> für eine Datenbank/Tabelle angeben, wenn es nur bei einzelnen Felder dann
> zur Wirkung kommt?!

Vielleicht solltest du bei Gelegenheit mal das Handbuch lesen:
http://dev.mysql.com/doc/refman/5.0/en/charset.html

Charset und Collation sind *Spalten*-Attribute. Die werden beim Anlegen
einer Spalte gesetzt und können später nur mehr per ALTER TABLE MODIFY
COLUMN & Co geändert werden.

Die Charset/Collation Deklaration für Tabellen/Datenbanken/Server sind
lediglich Defaults, die "geerbt" werden, wenn man bei der Erzeugung des
jeweils untergeordeneten Objekts keine Angaben macht.

Wenn du also die Collation einer Tabelle veränderst, passiert erstmal
gar nichts. Erst wenn du eine neue Spalte hinzufügst (ohne der eine
Collation zuzuweisen) erbt diese die Einstellungen der Tabelle.

>> Interessant wäre natürlich, was ein
>> SHOW CREATE TABLE
>> für die fraglichen Tabellen sagt.

In diesem Zusammenhang ist SHOW FULL FIELDS FROM

sinnvoller.


XL

Re: Problem mit COLLATION: Sortieren von Umlauten

am 02.02.2007 08:48:48 von Bernhard Berger

Axel Schwenke wrote:

>> Wozu kann man denn dann überhaupt eine COLLATION
>> für eine Datenbank/Tabelle angeben, wenn es nur bei einzelnen Felder dann
>> zur Wirkung kommt?!
>
> Charset und Collation sind *Spalten*-Attribute. Die werden beim Anlegen
> einer Spalte gesetzt und können später nur mehr per ALTER TABLE MODIFY
> COLUMN & Co geändert werden.
>
> Die Charset/Collation Deklaration für Tabellen/Datenbanken/Server sind
> lediglich Defaults, die "geerbt" werden, wenn man bei der Erzeugung des
> jeweils untergeordeneten Objekts keine Angaben macht.
>
> Wenn du also die Collation einer Tabelle veränderst, passiert erstmal
> gar nichts. Erst wenn du eine neue Spalte hinzufügst (ohne der eine
> Collation zuzuweisen) erbt diese die Einstellungen der Tabelle.

Danke dir und Christian für die Hilfe,das ist genau dass was ich wissen
wollte.

Habe leider diese Erklärungen anfangs selbst nicht im Handbuch/FAQ/Google
finden können. Werde nun also doch jede Spalte einzeln ändern.

mfg,
Bernhard