Einzelnen Beitrag anzeigen
 
Alt 09.08.2006, 13:08
DarkRoot DarkRoot ist offline
Registered User
 
Registriert seit: 08.2006
Beiträge: 1
*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
Aber sie erfüllt ihren Zweck.

PHP-Code:
<?
#########################################################################
#########################################################################
##                                                                     ##
## 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>');

?>

Geändert von DarkRoot (10.06.2009 um 15:00 Uhr)
Mit Zitat antworten