Kollation von Tabellen ändern ?!

schwaigerf

Registered User
Hi Leute,

ich habe folgendes Problem.
Ich habe mir eine Fotogallery installiert die mit mysql läuft.
Leider gibts es noch Probleme mit dem Zeichensatz bzw. mit der Kollation....

Mir haben Leute geraten ich soll die Kollation von den 3 TABELLEN auf latin1_german_ci umstellen.
Jedoch gibt es die Möglichkeit nicht bei der Auswahl. Es gibt nur latin1 und wenn ich dieses wähle macht er mir automatisch auf latin1_swedish_ci..

Kann mir dabei jemand helfen wie ich die 3 Tabellen auf german_ci umstelle ?
Gibt es dazu einen Befehl ?

Danke im voraus
schwaigerf
 
F

flyingoffice

Guest
schwaigerf said:
Kann mir dabei jemand helfen wie ich die 3 Tabellen auf german_ci umstelle?
Am besten den Default auf latin1_german1_ci in der my.cnf stellen und die Tabellen erneut importieren/anlegen. Siehe auch diesen Thread.

PS Du Plenkst bei den "?" ;)

Gruß flyingoffice
 

nobody21395

Registered User
Lösung:

Plesk starten.

Datenbank aufrufen.

In der Tabellenansicht dann wo die falsche Kollation eingetragen ist dann auf das Icon : Struktur klicken.

Es geht eine neue Seite auf.

Wenn diese Neue Seite aufgegangen ist dann oben auf : Operationen klicken.

Es geht eine neue Seite auf.

Auf dieser neuen Seite kann jetzt die neue Kollation eingestellt werden.
(Es ist von phpadmin zu phpadmin unterschiedlich)

Wenn die neue Koallation eingestellt ist auf OK klicken.

Das muss jetzt mit JEDER Tabelle gemacht werden die „falsch“ ist.

Hoffe das diese Beschreibung verstanden wird.

Nobody21395
 

Attachments

  • seite1.JPG
    seite1.JPG
    143.6 KB · Views: 3,042
  • seite2.JPG
    seite2.JPG
    116.3 KB · Views: 2,363
  • seite3.JPG
    seite3.JPG
    115.5 KB · Views: 2,237

monotek

Registered User
Wer viele Tabellen hat, kann auch folgendes Bash Script nutzen. Es werden alle Kollationen der Tabellen sowie der Datenbank auf utf8_unicode_ci gesetzt. Danach wird die Datenbank gedumpt und alle Zeichen mit Iconv auf UTF8 konvertiert. Danach wird die Datenbank wieder eingespielt.

Code:
#!/bin/bash
#
# MySQL UTF8 Converter by Monotek
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

# config
mysql_user="otrs"
mysql_pass="pass"
mysql_db="otrs"
mysql_opt="--opt --allow-keywords"
old_col="ISO8859-1"
tmp_dir="/tmp"

#script
echo "Dump database"
mysqldump ${mysql_opt} -u ${mysql_user} -p${mysql_pass} -hlocalhost ${mysql_db} | iconv -f ${old_col} -t UTF-8 | sed s'/ENGINE=MyISAM DEFAULT CHARSET=.*;/ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;/g' > ${tmp_dir}/${mysql_db}_utf.sql

echo "Import converted database"
( echo "DROP DATABASE ${mysql_db};"
echo "CREATE DATABASE ${mysql_db};"
echo "ALTER DATABASE ${mysql_db} DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
echo "USE ${mysql_db};"
echo "SOURCE ${tmp_dir}/${mysql_db}_utf.sql;"
) | mysql -u ${mysql_user} -p${mysql_pass} -hlocalhost

echo "Deleting temporary files"
rm -f ${tmp_dir}/${mysql_db}_utf.sql

echo "Done"
 
Last edited by a moderator:

DarkRoot

Registered User
*ausgrab*
Bei monoteks Bash Script werden leider nur die Standardwerte der Datenbank und Tabellen geändert.
Die Spalten bleiben jedoch wie vorher, was entfällt, wenn man das ganze neu importiert.

Falls man die Zeichenkonvertierung nicht braucht (z.B. beim wechsel von latin1_swedish auf latin1_german, wobei trotzdem schon deutsche Zeichen eingetragen wurden), kann man das folgende PHP Script benutzen, welches ich geschrieben habe.

Vorteile:
- Schneller, da das "dumpen" entfällt

Nachteile:
- Keine Zeichenkonvertierung

Sonstiges:
- Schrittweise, es werden nicht alle Queries in einem Durchgang gemacht (nötig durch die Benutzung von PHP)
- Ob die Benutzung von PHP ein Vor- oder Nachteil ist, muss jeder selbst entscheiden ;)

Wenn jemand langeweile hat, kann er ja noch 'ne Überprüfung einbauen, ob das "nächste Seite" angezeigt werden muss. Dazu müsste man jedoch die Zählweise etwas ändern, da sie ein wenig "schlampig" ist :p
Aber sie erfüllt ihren Zweck.

PHP:
<?
#########################################################################
#########################################################################
##                                                                     ##
## Script coded by Eric Reiche                                         ##
##                                                                     ##
## Version: 0.2 / 2006-08-16 17:35 GMT + 100                           ##
## Version 0.2 contains bugfixes                                       ##
##                                                                     ##
## Inspired by serversupportforum.de user monotek                      ##
## ( http://www.serversupportforum.de/forum/sql/        \              ##
## 9279-kollation-von-tabellen-aendern.html#post67293 )                ##
## [Check link  for bashscript]                                        ##
##                                                                     ##
## Web: http://www.ericreiche.net  ||  Mail: mail [AT] ericreiche [DOT] net  ##
##                                                                     ##
## You can spread this script, as long as you don't touch this copymark     ##
##                                                                     ##
#########################################################################
#########################################################################


//Config:
  $mysqlserver = 'localhost';    //Host
  $mysqluser = 'root';           //User [It's recommended to use root]
  $mysqlpw = 'passwort';                 //Password
  $mysqldb = 'datenbank';       //Database
  $stepping = 100;               //Queries per Page
  $tabletoskip = 'really_big_table'; //If you have a really big table, you can enter it here,
                                 //it will be skipped, to prevent a script abort
                               
  $collation = 'latin1_german2_ci';
  $character_set = 'latin1';
//End Config

#######################################################################
# Do not change anything from here, until you know what you're doing  #
#######################################################################
  
if(isset($_GET['start']) && is_numeric($_GET['start'])){
  $start = $_GET['start'];
  if($start > 0){
    $start = $start * $stepping;
  }
}else{
  $start = 0;
}
//mysql connect
@mysql_connect($mysqlserver, $mysqluser, $mysqlpw) OR die("No Conncection to Server. Report: :".mysql_error());
mysql_select_db($mysqldb) OR die("couldn't select database, Report: ".mysql_error());
unset($mysqlserver);
unset($mysqluser);
unset($mysqlpw);

$i = 0;
print('<pre>');
if($start == 0){
  $sql = 'ALTER DATABASE '.$mysqldb.' DEFAULT CHARACTER SET '.$character_set.' COLLATE '.$collation.";\r\n";
  mysql_query($sql);
  print($sql);
}

$sql = 'Show tables;';
$result1 = mysql_query($sql);
while($tables = mysql_fetch_assoc($result1)){
    if($start == 0){
    $sql = 'ALTER TABLE '.$tables['Tables_in_'.$mysqldb].' DEFAULT CHARACTER SET '.$character_set.' COLLATE '.$collation.";\r\n";
    mysql_query($sql);
    print('&nbsp;&nbsp;'.$sql);
  }
  
  $sql = 'Show columns FROM '.$tables['Tables_in_'.$mysqldb];
  $result2 = mysql_query($sql);
  
  while($columns = mysql_fetch_assoc($result2)){
    
    if(substr_count($columns['Type'], 'varchar') || substr_count($columns['Type'], 'text')){
      $i++;
      if($i >= $start && $i < ($start + $stepping)){
        $sql = 'ALTER TABLE '.$tables['Tables_in_'.$mysqldb].' CHANGE '.$columns['Field'].' '.$columns['Field'].' '.$columns['Type'].' CHARACTER SET '.$character_set.' COLLATE '.$collation.';';
        if($tabletoskip != $tables['Tables_in_'.$mysqldb]){
          mysql_query($sql);
          print('&nbsp;&nbsp;&nbsp;&nbsp;'.$i.'. '.$sql."\r\n");
        }else{
          print('&nbsp;&nbsp;&nbsp;&nbsp;'.$i.'. <b>SKIPPED</b>: '.$sql."\r\n");
        }
      }
    }
  }

}
print('</pre>');


  print('<a href="'.$_SERVER['PHP_SELF'].'?start='.($_GET['start'] + 1).'">Weiter...</a>');

?>
 
Last edited by a moderator:
N

Nym

Guest
DarkRoot, ich danke dir! Der Script war super und hat mir ein Haufen Arbeit erspart.
 

roxxer

New Member
Voeinstellung?!??

Wie stellt man das Vorher ein das die tabellen erst gar nicht schwedisch werden ????

ind die my.cnf hab ich schon folgendes reingemacht er nimmt das nur für die Datenbank nicht für die Tabellen

[mysqld]
default-character-set=latin1
default-collation=latin1_german1_ci

[mysql]
default-character-set=latin1
default-collation=latin1_german1_ci
 

Applecorner

New Member
Wer viele Tabellen hat, kann auch folgendes Bash Script nutzen. Es werden alle Kollationen der Tabellen sowie der Datenbank auf utf8_unicode_ci gesetzt. Danach wird die Datenbank gedumpt und alle Zeichen mit Iconv auf UTF8 konvertiert. Danach wird die Datenbank wieder eingespielt.

Code:
#!/bin/bash
#
# MySQL UTF8 Converter by Monotek
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

# config
mysql_user="otrs"
mysql_pass="pass"
mysql_db="otrs"
mysql_opt="--opt --allow-keywords"
old_col="ISO8859-1"
tmp_dir="/tmp"

#script
echo "Dump database"
mysqldump ${mysql_opt} -u ${mysql_user} -p${mysql_pass} -hlocalhost ${mysql_db} | iconv -f ${old_col} -t UTF-8 | sed s'/ENGINE=MyISAM DEFAULT CHARSET=.*;/ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;/g' > ${tmp_dir}/${mysql_db}_utf.sql

echo "Import converted database"
( echo "DROP DATABASE ${mysql_db};"
echo "CREATE DATABASE ${mysql_db};"
echo "ALTER DATABASE ${mysql_db} DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
echo "USE ${mysql_db};"
echo "SOURCE ${tmp_dir}/${mysql_db}_utf.sql;"
) | mysql -u ${mysql_user} -p${mysql_pass} -hlocalhost

echo "Deleting temporary files"
rm -f ${tmp_dir}/${mysql_db}_utf.sql

echo "Done"

Gib es für diesen Script auch die umgekehrte Richtig? Ich möchte gerne tabellen von utf8 nach latin1_swedish_ci convertieren lassen.
 

wstuermer

Blog Benutzer
Am einfachsten wäre es, die hiervon tangierten 3 Zeilen mal eben umzuschreiben :) Solltest Du auch relativ problemlos hinbekommen.
 

gogsi

New Member
Frage

Ich wollte eine Website im Kyrillisch einstellen, kann ich benutze Script von DarkRoot, aber was soll ich schreiben staat $collation = 'latin1_german2_ci';
$character_set = 'latin1'; ?

Ich benutze Danland Drupal theme, und weiss nicht wie soll ich das Script nennen und wo zu setzen es ?

Vielen Dank im Voraus!
 

Linux Homer

New Member
Monoteks Script

Hallo!

Wenn ich Monoteks Script unter einem Debian Squeeze ohne Plesk ausführe, ist meine Datenbank hinterher gelöscht. Ich möchte von latin1_swedish_ci auf UTF-8 umstellen, so wie es in dem Script vorgesehen ist. Oder was bdeutet:


old_col="ISO8859-1" ?


Ist damit auch latin1_swedish_ci gemeint oder ist das ein anderer ISO-Code? Vielleicht liegt dort der Fehler?

Viele Grüße

Homer
 

Linux Homer

New Member
Noch ein Zusatz. Wenn ich das Script ausführe, erhalte ich folgende Meldung:

mysqldump: Got error: 1016: Can't open file: './iliasdb/style_template.frm' (errno: 24) when using LOCK TABLES
Import converted database
Deleting temporary files
Done


Die DB ist danach komplett leer.
 
Top