Erstellung MySQL-DB als UTF-8

Hallo an alle!

Ich verwende MySQL 4.1. und 5.0.
Ich habe eine init.sql-Datei, die ich nutze um mein System neu einzuspielen. Nun hätte ich gerne, dass dieses init.sql die Datenbank, die Tabellen und den Inhalt als UTF-8 bei MySQL anlegt.

Die init.sql sieht so aus:
CREATE DATABASE dbTest;
CREATE TABLE CONTENT (
CID int(10) unsigned NOT NULL auto_increment,
DID int(10) unsigned DEFAULT ‚0‘ NOT NULL,
CLABEL varchar(255) DEFAULT ‚‘ NOT NULL,
CTITLE varchar(255) DEFAULT ‚‘ NOT NULL,
CTYPE varchar(255) DEFAULT ‚‘ NOT NULL,
CDESC varchar(255) DEFAULT ‚‘ NOT NULL,
C text,
V int(10) unsigned DEFAULT ‚0‘ NOT NULL,
PRIMARY KEY (CID)
);

INSERT INTO CONTENT VALUES (1,1,‚test‘,’’,’’,’’,’’,1);

ALTER TABLE CONTENT ADD INDEX IX_DID (DID);

  • ein paar ALTER, dass neue Spalten dazukommen.

Wie kann ich dieses initiale SQL-File so umbiegen, dass ich eine ganz in UTF-8 laufende Datenbank habe? Also dass ich beim Einspielen, das automatisiert über PHP abgewickelt wird, eine UTF-8-Datenbank habe.
Hat jemand eine Idee von Euch?
Finde leider nicht so wirklich das Richtige im Netz für mich.

Gruß PHANTOM

Hallo PHANTOM,

Ich verwende MySQL 4.1. und 5.0.
Ich habe eine init.sql-Datei, die ich nutze um mein System neu
einzuspielen. Nun hätte ich gerne, dass dieses init.sql die
Datenbank, die Tabellen und den Inhalt als UTF-8 bei MySQL
anlegt.

Die init.sql sieht so aus:
CREATE DATABASE dbTest;

Lieber so:

CREATE DATABASE dbTest default character set 'UTF8';

Das ist aber nur die halbe Miete. Die Datenbank sollte auch als utf8 gestartet werden, also per Hand z.B. so:

mysql -uuser -p[passwort] --default-character-set=UTF8

oder eben in der my.conf:

[mysqld] 
character-set-server=utf8 
default-character-set= utf8
...

Wie kann ich dieses initiale SQL-File so umbiegen, dass ich
eine ganz in UTF-8 laufende Datenbank habe? Also dass ich beim
Einspielen, das automatisiert über PHP abgewickelt wird, eine
UTF-8-Datenbank habe.

Und was PHP betrifft:

mysql\_query('set character set utf8;');

Genauer nachzulesen z.B. hier:
http://joomla-howto.net/LAMP/HowTo-UTF-8-MySQL-PHP-A…
http://www.gerd-riesselmann.de/softwareentwicklung/p…

Viele Grüße
Marvin

Hallo Marvin, (der paranoide Androide, gell :wink:)

Lieber so:

CREATE DATABASE dbTest default character set
‚UTF8‘;

Das ist aber nur die halbe Miete. Die Datenbank sollte auch
als utf8 gestartet werden, also per Hand z.B. so:

mysql -uuser -p[passwort]
–default-character-set=UTF8

oder eben in der my.conf:

[mysqld]
character-set-server=utf8
default-character-set= utf8

Genau, ich lege sie sogar noch mit collate mittlerweile an.
In die Konfig-Dateien kann ich nicht schreiben, dazu habe ich keine Rechte, deswegen muss das ohne diese gehen.

Wie kann ich dieses initiale SQL-File so umbiegen, dass ich
eine ganz in UTF-8 laufende Datenbank habe? Also dass ich beim
Einspielen, das automatisiert über PHP abgewickelt wird, eine
UTF-8-Datenbank habe.

Und was PHP betrifft:

mysql_query(‚set character set utf8;‘);

Genauer nachzulesen z.B. hier:
http://joomla-howto.net/LAMP/HowTo-UTF-8-MySQL-PHP-A…
http://www.gerd-riesselmann.de/softwareentwicklung/p…

Diese Quellen hatte ich auch schon. Ich habe mittlerweile so viele Tabs auf, dass ich nimmer weiß was wo stand.

Offen ist zur Zeit noch:

  • Wenn ich alles umgewandelt habe auf UTF-8 als default charset und auch collate mit utf-8, ist es dann notwendig (wie liegen die Inhalte in der MySQL-DB vor, als Latin1 oder seit 4.1. als UTF-8?) die Inhalte der Datenbanktabellen von Latin1 auf UTF-8 umzubiegen, und falls ja wie kann ich abfragen ob die Inhalte als Latin1 vorliegen, so dass ich sie dann mit PHP und iconv transformieren kann.

Danke + Gruß PHANTOM

Hallo PHANTOM.

Hallo Marvin, (der paranoide Androide, gell :wink:)

genau, aber auf mich hört eh niemand… :wink:
Und Du wohnst in der Oper?

Offen ist zur Zeit noch:

  • Wenn ich alles umgewandelt habe auf UTF-8 als default
    charset und auch collate mit utf-8, ist es dann notwendig (wie
    liegen die Inhalte in der MySQL-DB vor, als Latin1 oder seit
    4.1. als UTF-8?)

Ich verstehe die Frage nicht ganz. Ist das nicht dieselbe Frage in grün, die ich schon beantwortet habe? Die Daten in deiner MySQL-DB liegen in der Form vor, wie Du sie angelegt hast. Defaultmäßig ist das wohl immer noch Latin1 mit schwedischer Sortierung. Mag mich jemand korrigieren, wenn es in der aller-aller-neusten Version von MySQL nicht mehr so ist. Wenn Du was anders haben möchtest (utf8) musst Du das so festlegen, wie es in meiner Antwort beschrieben war.

die Inhalte der Datenbanktabellen von Latin1
auf UTF-8 umzubiegen, und falls ja wie kann ich abfragen ob
die Inhalte als Latin1 vorliegen, so dass ich sie dann mit PHP
und iconv transformieren kann.

Heisst das, daß die Datenbank mit Daten schon besteht, und Du willst sie aulesen? Ich hatte es eigentlich andersrum verstanden. Aber zur Problematik der Zeichensätze in MySQL, die sehr komplex ist, kannst Du ja noch zusätzlich das Handbuch durchlesen (Kapitel 10):
http://dev.mysql.com/doc/refman/5.1/de/charset.html

Ob das deine Frage jetzt besser beantwortet, weiss ich nicht, weil ich im Moment nicht ganz verstehe, was Du konkret mit

Inhalte der Datenbanktabellen von Latin1
auf UTF-8 umzubiegen

meinst.

Viele Grüße
Marvin

Hallo PHANTOM.

Hallo Marvin, (der paranoide Androide, gell :wink:)

genau, aber auf mich hört eh niemand… :wink:
Und Du wohnst in der Oper?

Nein, ich wohne in Entenhausen, leider war Phantomias nimmer frei gewesen,

Offen ist zur Zeit noch:

  • Wenn ich alles umgewandelt habe auf UTF-8 als default
    charset und auch collate mit utf-8, ist es dann notwendig (wie
    liegen die Inhalte in der MySQL-DB vor, als Latin1 oder seit
    4.1. als UTF-8?)

Ich verstehe die Frage nicht ganz. Ist das nicht dieselbe
Frage in grün, die ich schon beantwortet habe? Die Daten in
deiner MySQL-DB liegen in der Form vor, wie Du sie angelegt
hast. Defaultmäßig ist das wohl immer noch Latin1 mit
schwedischer Sortierung. Mag mich jemand korrigieren, wenn es
in der aller-aller-neusten Version von MySQL nicht mehr so
ist. Wenn Du was anders haben möchtest (utf8) musst Du das so
festlegen, wie es in meiner Antwort beschrieben war.

Ja, dann gehe ich mal von aus, dass die als Latin1 vorliegen. Sollte man die nicht dann umwandeln wenn schon tausende Datensätze in Latin1 vorliegen und ich definitiv nun immer UTF-8 haben will?

die Inhalte der Datenbanktabellen von Latin1
auf UTF-8 umzubiegen, und falls ja wie kann ich abfragen ob
die Inhalte als Latin1 vorliegen, so dass ich sie dann mit PHP
und iconv transformieren kann.

Heisst das, daß die Datenbank mit Daten schon besteht, und Du
willst sie aulesen? Ich hatte es eigentlich andersrum
verstanden. Aber zur Problematik der Zeichensätze in MySQL,
die sehr komplex ist, kannst Du ja noch zusätzlich das
Handbuch durchlesen (Kapitel 10):
http://dev.mysql.com/doc/refman/5.1/de/charset.html

Ach, ich habe so viele Baustellen. Ja, Daten bestehen schon, zumindest bei manchen Anwendungen. Ich arbeite zur Zeit alles auf UTF-8 um was ich habe. Neben meinen kleinen privaten Programmen, bastle ich auch mit einem Kollegen an etwas Neuem herum. Bin sozusagen Programmier-Bastler in meiner Freizeit neben dem Studium.

Ob das deine Frage jetzt besser beantwortet, weiss ich nicht,
weil ich im Moment nicht ganz verstehe, was Du konkret mit

Inhalte der Datenbanktabellen von Latin1
auf UTF-8 umzubiegen

meinst.

Damit meine ich: Die ganze Zeit lief alles auf Latin1. So wurden doch auch wenn ich inserts mache Inhalte als Latin1 in die Datenbank reingeschrieben. Und nun will ich alles in UTF-8 haben. Das Frontend soll alles in UTF-8 ausgeben, alles soll UTF-8-kodiert in die Datenbank geschrieben werden. So habe ich doch dann Latin1 und UTF-8-Content in meiner Datenbank. Und das wollte ich ändern, dass die bisherigen Latin1-codierten Inhalte umgewandelt in UTF-8 werden sollen.

Vielleicht ist es auch einfach zu spät für mich heute und sollte mich hinlegen :smile:

Gruß PHANTOM

Hallo PHANTOM.

Daten bestehen schon,
zumindest bei manchen Anwendungen.

Die ganze Zeit lief alles auf Latin1.
Und nun will ich alles in UTF-8
haben.

Gut, konzentrieren wir uns einfach auf die Umwandlung der Datenbank von latin1 auf UTF8. Ich setze jetzt mal voraus, daß dein ganzes Betriebssystem jetzt mit utf8 als Standard läuft.
Dann nimmst Du einfach mysqldump
http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html
und spielst alle deine umzuwandelnden Daten in Files auf den Rechner. Läßt sich ja prima automatisieren und das schöne daran ist, mysqldump (zumindest in den neueren Versionen) gibt standardmäßig alle Daten als UTF8 aus. Das weniger schöne, im mit erzeugten Befehl zum Zurückspielen steht dann noch der Original-Character-Set, in deinem Fall also DEFAULT CHARSET=latin1. Das kannst Du aber leicht vollautomatisch mit deiner bevorzugten Skriptsprache in DEFAULT CHARSET=utf8 umwandeln. Dann Datenbank löschen, mit UTF8 neu anlegen (was dabei zu beachten ist steht ja schon in den vorherigen Antworten) und die ganzen Daten zurückspielen. Schon hast Du eine saubere utf8-DB.
Willst Du das Umwandeln von DEFAULT CHARSET vermeiden, kannst Du auch einfach nur die Daten exportieren.
Ich habe jetzt nicht alle Feinheiten ausgetestet, aber eine alte DB von mir hat es wunderbar von latin1 nach utf8 umgewandelt.

Viele Grüße
Marvin

Hey Marvin,

danke für deine geduld mit mir!
Wir reden aneinander vorbei. Das was du geschrieben hast ist klar.
Ich habe auch gerade was gefunden was ich gerne haben möchte:

SQL Methode
Es ist möglich, die MySQL-Funktionen CONVERT() und CAST() zu benutzen, um Daten innerhalb ihrer SQL-Skripte zu konvertieren.

-> Genau das möchte ich. Ich will den Inhakt einer bestehende Datenbank von Latin1 zu UTF8 ändern. Geht wohl mit den beiden SQL-Funktionen.

Gruß PHANTOM

Vielleicht noch mal verständlicher: Bisher wohl alles Latin1.

mache ich ein select testspalte from testtabelle where id=1;
dann kriege ich
„ein toller in Latin1 codierter Text in der datenbank“

Ich will aber, dass dieser Text UTF-8 codiert in der Datenbank steht.

Nun habe ich gelesen (http://www.phpforum.de/archiv_67022_Zeichensatz@best…):

„Wichtig: ein Änderung des Zeichensatzes bewirkt NICHT eine Konvertierung vorhandener Daten. Ebenso werden eingehende Daten NICHT auf Zeichensatz getestet und ggf. konvertiert. Die Datenbank speichert einfach nur ab.“

Zudem in diesem Beitrag:
ALTER TABLE TABELLENNAME CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
-> Was tut dieser Befehl? Ändert dieser die bestehenden Daten innerhalb meiner Tabelle oder warum brauche ich den?

Mittlerweile sieht meine Konvertierung so in der Art aus:
Datenbank:
ALTER DATABASE freshness DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Tabelle default:
ALTER TABLE ADRESS DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Tabelle konvertieren:
ALTER TABLE ADRESS CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
Spalte konvertieren:
ALTER TABLE ADRESS CHANGE FIRMA FIRMA varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ‚‘;

Ist das ausreichend?

Gruß PHANTOM

Hallo Phantom,

Wir reden aneinander vorbei. Das was du geschrieben hast ist
klar.

-> Genau das möchte ich. Ich will den Inhakt einer
bestehende Datenbank von Latin1 zu UTF8 ändern.

Ach, was soll ich noch sagen. Ich weiss jetzt nicht, wo die Mißverständnisse liegen.
Du möchtest den Inhalt einer bestehenden Datenbank von latin1 nach utf8 ändern, ja. Und genau eine Methode dazu habe ich dir in meiner vorigen Antwort geschrieben. Mit mysqldump die Daten auf deinen Rechner holen, dabei wandelt mysqldump die Daten wie gewünscht in utf8 um. Dann diese Daten in eine leere utf8-DB zurückspielen. Dann hast Du genau das, was Du möchtest.
Ist garantiert nicht der einzige Weg, sicher auch nicht der eleganteste, aber er funktioniert. Mit meiner Test-Datenbank hat das ganze Umwandeln ca. 1-2 Minuten gedauert und anschliessend waren alle Daten in der Datenbank in utf8, auch der eine, probehalber neu eingefügte.
Du kannst auch irgendwas mit PHP machen, warum nicht, wenns geht. Viele Wege führen nach Rom, ich bestehe nicht auf meiner Lösung. Aber zu PHP kann ich nicht viel sagen, da habe ich nur Grundkenntnisse.

Viele Grüße
Marvin

Ich habe mich mal in einen Beitrag dazu auf administrator.de „eingemischt“:
http://www.administrator.de/index.php?content=95ada1…

Ich will das, weil es ja automatisiert gehen soll nicht über mysqldump lösen!

Gruß PHANTOM