Zum Inhalt springen

DB auf utf8 umstellen

Erstellt am 6. Juli 2007 · 10 Antworten · letzte Antwort am 26. Dezember 2007

Tags: Frage

daniz78 ·

Die Welt wird immer kleiner und da möchte man doch auch ausländischen Freunden seine Internetseite in Ihrer Landessprache präsentieren.

Leider ist Typo3 standardmässig nicht dafür ausgelegt...
...hier also ein kleines HOW-TO für die Umstellung auf UTF-8:

// 1 // UTF-8 Support für Typo3 freischalten

Entweder in der localconf.php folgendes einfügen:

$TYPO3_CONF_VARS['SYS']['setDBinit'] = 'set names utf8'
$TYPO3_CONF_VARS['SYS']['UTF8filesystem'] = '1';
$TYPO3_CONF_VARS['BE']['forceCharset'] = 'utf-8';

oder im Installtool unter All-Configuration:

[SYS][setDBinit] = set names utf8
[SYS][UTF8filesystem] = 1 (Haken setzen)
[BE][forceCharset] = utf-8

// 2 // Tabellen auf UTF-8 umstellen und löschen

Die Extension phpMyAdmin installieren

In phpMyAdmin:

- UTF-8 umstellen --> Operationen/Kollation/utf8_unicode_ci
- alle Tabellen löschen --> Struktur/Alle auswählen/markierte löschen

!!! Es werden auch die Session-Tabellen gelöscht !!!

// 3 // Adminuser erneut anlegen und ins backend einloggen

Im Install-Tool unter 2) Database Analyser:

- Update required tables --> COMPARE / Write to Database (erzeugt alle Tabellen)
- Dump static data --> IMPORT (importiert die statischen Templates u.a. css_styled_content)
- Dump static data --> Create "admin" user (Benutzernamen + Passwort eingeben)

Anschliessend wieder einloggen und in phpMyAdmin das Ergebnis prüfen!

- Kollation (sollte auf utf8_unicode_ci stehen)
- Typ (einige Tabellen sind nun vom Typ "InnoDB")

That´s it!!!

!!! HINWEISE !!!

Funktioniert nur mit MySQL ab 4.1.x

Eine Umstellung auf UTF-8 sollte nur bei neuen Typo3-Installationen durchgeführt werden!
Ansonsten vorher einen Dump (es darf kein latin_1 oder ähnliches drinnstehn) ziehen
und nach Abschluss der Umstellung den Dump einspielen...viel Glück!

Ich gebe keine Garantie und übernehme keinerlei Haftung!!!

Gruß, Daniz

wernert ·

Hallo
Also ich habe die Anweisungen an einer neuen typo3 4.1.2 installation ausgeführt.
hat soweit funktioniert, auch die InnoDB Tabellen sind da.
Allerdings sind die Tabellen danach wieder latin1_german1_ci.
Die DB war auch schon vorher utf8_general_ci.
bestes
werner trunk

daniz78 ·

Hallo Werner!

Allerdings sind die Tabellen danach wieder latin1_german1_ci.

Wenn Du damit das Einspielen des Dumps meinst, schau mal dort rein und suche nach Anweisungen um die Tabellen anzulegen. (CREATE TABLE)

Es darf nix drinstehen á la SET CHARSET = "latin_1"

Gruß, Daniz

jousch ·

Und das wirkliche Nutzen von UTF-8?
Ich meine muss man dann den W3C Header auchdementsprechend anpassen und dieser ist dann nicht mehr xhtml? Oder wie ist das? Können alle Geräte UTF-8?

daniz78 ·

Ähm...grundsätzlich ist UTF-8 erstmal ein Zeichensatz, mit dem definiert wird, wie die XHTML-Seite gespeichert wird.

Standardmässig wird in Deutschland "iso-8859-1" (= Latin-1) verwendet.
http://de.wikipedia.org/wiki/ISO_8859-1

Dieser Zeichensatz hat aber nur ein Länge von 8bit=256 mögliche Zeichen und besitzt nicht alle Sonderzeichen westeuropäischer Sprachen (z.B. spanisch, französisch). Latin-15 ist schon etwas besser, reicht manchmal aber auch noch nicht.

UTF-8 unterstützt bis zu vier Byte (4 x 8 bit) womit theoretisch über 2 Mio. Zeichen kodiert werden können.http://de.wikipedia.org/wiki/UTF-8 Damit kannst Du eine Seite auch auf Chinesisch, Spanisch, Russisch, etc. kodieren. War bei mir aktuell der Fall, weshalb ich das HowTo geschrieben habe...

Den Header musst Du natürlich entsprechend anpassen, d.h. den Content-Type angeben:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Diese Deklaration ist optional:

<?xml version="1.0" encoding="utf-8" ?>

Ob alle Geräte UTF-8 unterstützen, kann ich nicht sagen, da zitiere ich lieber Wiki:

Die Internet Engineering Task Force verlangt von allen neuen Internetkommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist.

Gruß, Daniz

BenjaminW ·

Ich möchte mal mutig sein und ein bestehendes System auf utf8 umstellen. Derzeit ist es nämlich so, dass die Spaltentypen meiner DB alle auf latin1 stehen, TYPO3 allerdings alles fröhlich als UTF-8 schreibt (zumindest fällt mir das stark beim Content auf).
Problematisch ist nämlich, dass die Suche (indexed_search) nicht richtig mit Umlauten funktioniert, da diese die Wörter direkt im SELECT Abfragt, die DB aber keine utf8 Vergleiche bei latin1 Spalten macht.

Mein Ansatz wäre nun, *alle* VARCHAR und TEXT Spalten in die entsprechenden Binary-Formate (VARCHAR BINARY, BLOB) zu wandeln (ALTER TABLE) und diese anschließend wieder zurück ins ursprüngliche Format (aber mit Charset utf8-) zu bringen. Denn dadurch findet keine Konvertierung seitens MySQL statt (von und nach BINARY Typen wird nicht konvertiert).
Dies ließe sich recht einfach per Shell Script und einer Hand voll SHOW Befehle realisieren.

Was meint ihr? Wo könnte es Probleme geben? Welche spalten füllt TYPO3 trotzdem im latin1 Zeichensatz?

Gruß,
Benjamin

BenjaminW ·

Ich möchte noch eine Mini-Howto für Zeichensätze bei MySQL anfügen. Evtl. ist das für manche hilfreich.

MySQL unterstützt seit Version 4.1 die Datenhaltung in verschiedenen Zeichensätzen vollständig. Hierbei kann der Zeichensatz bis auf die Spaltenebene definiert werden. Ist für die Spaltenebene kein Zeichensatz definiert, gilt der Zeichensatz der Tabelle, ist dieser nicht definiert, gilt der Zeichensatz der Datenbank (Schema) und zuletzt gibt es noch für den Server einen Default-Wert.
Als wäre das nicht schon kompliziert genug, gibt es für die Client-Verbindung noch einen aktuellen Zeichensatz. Dieser wird durch den Befehl "SET NAMES ..." gesetzt. MySQL wird anschließend automatisch alle Daten (außer BINARY Spalten) automatisch in das entsprechende Format konvertieren, welches der Client (also PHP) durch den SET NAMES Befehl angegeben hat.

Der Zeichensatz bestimmt nicht nur die Art der Kodierung und die Speicherung. Außerdem gibt es noch dem Zeichensatz zugeordnete Sortierungen (Collations). Diese werden wie der Name schon sagt für Sortierung und Vergleiche verwendet. Insbesondere enthalten die Collations Regelsätze für equivalente Zeichen (a = A, ß = ss, ß = s, ä = a, ä = ae, ...), welche auch bei LIKE Abfragen verwendet werden. Sucht man nach "Müller", findet der Server auch je nach Collation "Mueller" und "Muller".
Mit Hilfe von "SHOW CHARACTER SET" und "SHOW COLLATION" kann man sich eine Liste aller Zeichensätze und Collations ausgeben lassen.

Weitere Infos zu den Zeichensatz Featuresvon MySQL und deren Verwendung findet ihr in der Dokumentation: http://dev.mysql.com/doc/refman/4.1/en/charset.html
Die deutsche Doku kann ich nicht empfehlen: http://dev.mysql.com/doc/refman/5.1/de/charset.html

jousch ·

Also bei mir wurde den Datenbanktabellen nicht umgeändert!

Ich hab deshalb das hier verwendet:

<?php    
   
$dbname   = 'db-name';
$dbserver = 'localhost';
$dbuser   = 'sql-benutzer';
$dbpass   = 'sql-passwort';
$con = mysql_connect($dbserver, $dbuser, $dbpass);
   
$collate  = 'utf8_unicode_ci';
     mysql_query("ALTER DATABASE '$dbname' DEFAULT CHARACTER SET utf8 COL-LATE $collate");
	 $res = mysql_query("SHOW TABLES FROM `$dbname`");
	 while($row = mysql_fetch_row($res)) {
	 $query = "ALTER TABLE {$dbname}.`{$row[0]}` CONVERT TO CHARACTER SET utf8 COLLATE $collate";
	 mysql_query($query);
	 $query = "ALTER TABLE {$dbname}.`{$row[0]}` DEFAULT CHARACTER SET utf8 COLLATE $collate";
	 mysql_query($query);
	 }
	 mysql_close($con);
	 echo 'Die Datenbank wurde auf UTF-8 umgestellt.'; 
?>
InforMedic ·

Ein erweitertes HowTo (enthält mitunter die gleichen Schritte wie hier) könnt ihr hier finden: #68944

Dort findet ihr ein script, mit welchem sich auch die DB-Werte konvertieren lassen und nicht einfach nur das Column Charset =)

Gruß
Info

zulumaster ·

bei meiner typo3 4.0.4 version gibt es den punkt [SYS][UTF8filesystem]
nicht im installtool. gibt es da noch eine andere lösung?
ab welcher version geht das denn überhaupt mit dem umstellen auf utf-8?

[SYS][setDBinit] = set names utf8
[SYS][UTF8filesystem] = 1 (Haken setzen)
[BE][forceCharset] = utf-8

alex

Epo-Na ·

[SYS][UTF8filesystem] = 1

geht erst ab TYPO3 4.1. Mit dieser Option hast Du dann auch die Möglichkeit im Backend komplett UTF-8 auszugeben und Filenamen in UTF-8 zu kodieren. Dies kann dann zur Folge haben, das Du auch Dateinamen in kryllisch oder chinesisch erzeugen könntest... (falls gewünscht!).
Die normale Umstellung des Frontends und der DB ist davon nicht betroffen.

Beste Grüße
Micha