Kollationsänderung nach Serverumzug

MySQL, PostgreSQL, SQLite
jluerken
Posts: 58
Joined: 2003-03-10 10:53

Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-21 08:15

Hi,

auf meinem alten Server liefen meine Datenbanktabellen mit der Kollation latin1_swedish_ci.
Ich habe nach einem Serverumzug alle Datenbanken importiert und alles hat geklappt.
Nun habe ich erste neue Tabellen angelegt und diese bekommen die Kollation utf8_general_ci.

Erste Anwendungen melden einen Missmatch da und verursachen Fehler.
Ich denke utf8_general_ci ist der richtige Wert.

Wie kann ich alle Datenbanken komplett und einfach darauf umstellen und künftig dafür sorgen das EX- und Import immer mit der korrekten Kollation laufen?

Gruss
jluerken

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Kollationsänderung nach Serverumzug

Post by daemotron » 2007-09-21 13:55

Du kannst UTF-8 als Standard-Zeichensatz in der my.cnf sowohl für Client, Server und mysqldump eintragen. Bestehende Datenbanken konvertierst Du folgendermaßen:

Code: Select all

ALTER DATABASE `<Deine_DB>` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

jluerken
Posts: 58
Joined: 2003-03-10 10:53

Re: Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-21 18:21

jfreund wrote:Du kannst UTF-8 als Standard-Zeichensatz in der my.cnf sowohl für Client, Server und mysqldump eintragen. Bestehende Datenbanken konvertierst Du folgendermaßen:

Code: Select all

ALTER DATABASE `<Deine_DB>` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci


Danke sehr. Wenn du mir nun noch verraten kannst was ich in der my.cnf eintragen müsste wäre es perfekt :wink:

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Kollationsänderung nach Serverumzug

Post by daemotron » 2007-09-21 23:30

Joe User hat eine ziemlich brauchbare Konfiguration hier im Forum gepostet (siehe http://www.rootforum.org/forum/viewtopic.php?t=36343). Da sind die Zeichensatz-Angaben für utf-8 für fast alle Hilfsprogramme drin gesetzt. Ansonsten wäre auch noch http://blog.koehntopp.de/archives/1837-Eine-my.cnf-Datei-erzeugen-Teil-1.html lesenswert, in Zusammenhang mit Deiner Frage natürlich insbesondere der Abschnitt über Zeichensätze.

jluerken
Posts: 58
Joined: 2003-03-10 10:53

Re: Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-23 08:07

jfreund wrote:Du kannst UTF-8 als Standard-Zeichensatz in der my.cnf sowohl für Client, Server und mysqldump eintragen. Bestehende Datenbanken konvertierst Du folgendermaßen:

Code: Select all

ALTER DATABASE `<Deine_DB>` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci



Leider ändert diese Query nicht die einzelnen Tabellen innerhalb der DB die bereits falsch sind. Diese muss ich jedoch auch alle ändern.
Ich wette dazu kennst du auch die passende Query oder? :D

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Kollationsänderung nach Serverumzug

Post by daemotron » 2007-09-23 09:11

Code: Select all

ALTER TABLE `murks`  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE `murks` CHANGE `blub` `blub` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
Mit dem letzten Befehl änderst Du die einzelnen Felder innerhalb einer Tabelle (hier das Feld "blub" in der Tabelle "murk". Die Collation-Eigenschaft hängt nämlich letztlich am einzelnen Feld; beim neu anlegen eines Feldes erbt dieses nur diese Eigenschaft von der Tabelle, die es wiederum von der Datenbank erbt. Bestehende Felder müssen aber direkt angefasst werden.

jluerken
Posts: 58
Joined: 2003-03-10 10:53

Re: Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-23 09:30

Kann ich den ersten Befehl irgendwie wie genereller gestalten?
So muss ich Tabelle für Tabelle durchgehen. Gibts nicht sowas wie?

Code: Select all

ALTER TABLE `ALLETABELLEN`  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci


...oder besser noch ne Query die in einer Datenbank grundsätzlich überall die Collate ändert. Ich will nicht jede Tabelle einzeln durchgehen, das wäre zu viel.

jluerken
Posts: 58
Joined: 2003-03-10 10:53

Re: Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-23 10:35

Hab nun alle Tabellen geändert, bekomme aber nun folgende Fehlermeldung:

Code: Select all

SELECT * FROM vb3_predeftxts WHERE FIND_IN_SET('4', fids) > 0 AND FIND_IN_SET('6', ugids) > 0 AND (showon=1 OR showon=3);

MySQL Error  : Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (utf8_general_ci,IMPLICIT) for operation 'find_in_set'
Error Number : 1267


Die entsprechende Tabelle hab ich mir angesehen, eingestellt ist definitiv nun utf8_general_ci. Keine Ahnung was er da meckert.

jluerken
Posts: 58
Joined: 2003-03-10 10:53

Re: Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-24 09:36

jluerken wrote:Hab nun alle Tabellen geändert, bekomme aber nun folgende Fehlermeldung:

Code: Select all

SELECT * FROM vb3_predeftxts WHERE FIND_IN_SET('4', fids) > 0 AND FIND_IN_SET('6', ugids) > 0 AND (showon=1 OR showon=3);

MySQL Error  : Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (utf8_general_ci,IMPLICIT) for operation 'find_in_set'
Error Number : 1267


Die entsprechende Tabelle hab ich mir angesehen, eingestellt ist definitiv nun utf8_general_ci. Keine Ahnung was er da meckert.


Hab den Fehler gefunden. Google und die Forensuche sei Dank!
Es handelt sich hierbei wohl um einen Bug meiner MySQL Version.
Ich habe die my.cnf nun auf latin1 undgestellt und alle Tabellen sowie Felder auf latin1_swedish_ci
Bisher funktioniert das ganz gut und ich konnte noch keine Fehler feststellen.

jluerken
Posts: 58
Joined: 2003-03-10 10:53

Re: Kollationsänderung nach Serverumzug

Post by jluerken » 2007-09-24 11:41

Leider zu früh gefreut.
Alle aktuellen Tabellen laufen tadellos aber neue Tabellen werden grundsätzlich mit utf8_general_ci angelegt.

In der my.cnf hab ich allerdings unter [mysqld]

Code: Select all

character-set-server  = latin1
default-character-set = latin1
default-collation = latin1_swedish_ci


eingetragen.

Was könnte ich vergessen oder falsch gemacht haben?
MySQL Version Version: 4.1.10a-log