Revision: 56748
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at April 13, 2012 19:47 by sjasliek
Initial Code
<?php /******************************************/ // db_utf8_fix.php // // Author: J. van Hemert // // // // Fixes encoding when utf-8-encoded data // // is stored in tables with other (e.g. // // latin_swedish_ci) encoding. // // Will convert all columns in all tables // // to utf8_general_ci. // // Run from fileadmin folder in TYPO3 // // installation. // /******************************************/ //Set to TRUE to generate an enormous amount of debug output with //analysis of table structure. define("DEBUG", FALSE); //Set to FALSE to really convert the database define("SIMULATE", FALSE); require_once ('../typo3conf/localconf.php'); echo str_repeat(' ', 256); ?> <html> <head> <style type="text/css"> .normal { color: black; } .okay { color: green; } .label { color: blue; } .error { color: red; } </style> </head> <body> <?php $tables = array(); $typeconv = array( "char" => "binary", "text" => "blob", ); $db = mysql_connect($typo_db_host, $typo_db_username, $typo_db_password, TRUE); if (!is_resource($db)) { die("Could not connect to db!: " . mysql_error()); } if (mysql_select_db($typo_db, $db) === FALSE) { die("Could not select database!: " . mysql_error()); } $sql = "SHOW TABLES;"; $db_res = mysql_query($sql, $db); if (!is_resource($db_res)) { die ("Could not get query result!: " . mysql_error() . "\n" . $sql); } while ($row = mysql_fetch_array($db_res, MYSQL_NUM)) { if (DEBUG) var_dump($row); $tables[] = $row[0]; } foreach ($tables as $table) { echo "<div><span class=\"label\">".$table.": </span><span class=\"normal\">"; $sql = "SHOW FULL COLUMNS FROM `$table`;"; $db_res = mysql_query($sql, $db); if (!is_resource($db_res)) { die ("Could not get table data!: " . mysql_error() . "\n" . $sql); } $columns = array(); while ($row = mysql_fetch_assoc($db_res)) { if (DEBUG) { echo "column: "; var_dump($row); } $columns[] = $row; } foreach ($columns as $column) { set_time_limit(60); $oldtype = $column['Type']; if (DEBUG) echo "Original: ".$column['Type']."\n"; $column['Type'] = str_replace(array_keys($typeconv), array_values($typeconv), $column['Type']); if (DEBUG) echo "modified: ".$column['Type']."\n"; if ($column['Type'] != $oldtype) { $column['Null'] = (strtolower($column['Null']) == "yes") ? "NULL" : "NOT NULL"; $column['Default'] = (is_numeric($column['Default'])) ? $column['Default'] : ($column['Default'] === "NULL")? $column['Default'] : "'{$column['Default']}'"; /* $sql = "ALTER TABLE `$table` MODIFY COLUMN `{$column['Field']}` {$column['Type']} {$column['Null']} DEFAULT {$column['Default']} {$column['Extra']};"; if (DEBUG) { echo "$sql\n"; } else { if (!SIMULATE) { $db_res = mysql_query($sql, $db); if (!is_resource($db_res) && mysql_errno($db) != 0) { echo "Could not execute query!: " . mysql_error($db) . "\n" . $sql; } } } */ $column['Type'] = str_replace(array_values($typeconv), array_keys($typeconv), $column['Type']); $sql = "ALTER TABLE `$table` MODIFY COLUMN `{$column['Field']}` {$column['Type']} CHARACTER SET utf8 COLLATE utf8_general_ci {$column['Null']} DEFAULT {$column['Default']} {$column['Extra']};"; if (DEBUG) { echo "$sql\n"; } else { if (!SIMULATE) { $db_res = mysql_query($sql, $db); if (!is_resource($db_res) && mysql_errno($db) != 0) { echo "Could not execute query!: " . mysql_error($db) . "\n" . $sql; } } echo "."; ob_flush(); flush(); } } } $sql = "ALTER TABLE `$table` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; if (DEBUG) { echo "$sql\n"; } else { if (!SIMULATE) { $db_res = mysql_query($sql, $db); if (!is_resource($db_res) && mysql_errno($db) != 0) { echo "Could not execute query!: " . mysql_error($db) . "\n" . $sql; } } echo "</span><span class=\"okay\"> OK</span></div>"; ob_flush(); flush(); } } echo "<div><span class=\"label\">DATABASE: </span><span class=\"normal\">"; $sql = "ALTER DATABASE `$typo_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; if (DEBUG) { echo "$sql\n"; } else { if (!SIMULATE) { $db_res = mysql_query($sql, $db); if (!is_resource($db_res) && mysql_errno($db) != 0) { echo "Could not execute query!: " . mysql_error($db) . "\n" . $sql; } } echo "</span><span class=\"okay\"> OK</span></div>"; ob_flush(); flush(); } echo "<div>finished converting tables</div>"; mysql_close($db); ?> </body> </html>
Initial URL
Initial Description
Author: J. van Hemert Fixes encoding when utf-8-encoded data is stored in tables with other (e.g. latin_swedish_ci) encoding. Will convert all columns in all tables to utf8_general_ci.
Initial Title
UTF8 Database fix
Initial Tags
mysql, database
Initial Language
PHP