通常我們都用 phpMyAdmin 來導(dǎo)出,不過如果你的數(shù)據(jù)庫如果存在下列問題,那么 phpMyAdmin 也無能為力。 數(shù)據(jù)庫的字符集與應(yīng)用程序的字符集不一致; 應(yīng)用程序用錯誤的編碼將數(shù)據(jù)保存到了數(shù)據(jù)庫中; 用 phpMyAdmin 和 mysqldump 導(dǎo)出的數(shù)據(jù)總是亂碼。 總之你用 phpMyAdmin 和 mysqldump 導(dǎo)出的數(shù)據(jù)有亂碼時,就試試看這個腳本吧。 使用很簡單: php export_db.php 數(shù)據(jù)庫名 [-h 主機名] [-c 字符集] [-f 輸出文件名] [-u 用戶名] [-p] 這個腳本的導(dǎo)出結(jié)果就是一個 .sql 文件,只有 insert 語句。 源代碼: [php] <?php if (!function_exists('mysql_connect')) { if (DIRECTORY_SEPARATOR == '/') { dl('php_mysql.so'); } else { dl('php_mysql.dll'); } } $database = null; if (isset($argv[1])) { $database = $argv[1]; } else { display_help(); exit; } $optional_args = array( '-h' => 'hostname', '-c' => 'charset', '-f' => 'filename', '-u' => 'username' ); $options = array( 'hostname' => 'localhost', 'charset' => 'utf8', 'filename' => '%s.sql', 'username' => 'root', ); $input_password = false; for ($i = 2; $i < $argc; $i++) { $arg = $argv[$i]; if ($arg == '-p') { $input_password = true; continue; } if (isset($optional_args[$arg])) { $value_name = $optional_args[$arg]; if (isset($argv[$i + 1])) { $options[$value_name] = $argv[$i + 1]; $i++; } } } if ($input_password) { echo "password: "; fscanf(STDIN, '%s', $password); $options['password'] = $password; echo "\n"; } else { $options['password'] = ''; } if ($database == null) { display_help(); exit; } mysql_connect($options['hostname'], $options['username'], $options['password']); mysql_select_db($database); mysql_query("SET NAMES '{$options['charset']}'"); // 設(shè)置要導(dǎo)出的表 $tables = list_tables($database); $filename = sprintf($options['filename'], $database); $fp = fopen($filename, 'w'); foreach ($tables as $table) { dump_table($table, $fp); } fclose($fp); mysql_close(); echo "done.\n"; exit; function list_tables($database) { $rs = mysql_list_tables($database); $tables = array(); while ($row = mysql_fetch_row($rs)) { $tables[] = $row[0]; } mysql_free_result($rs); return $tables; } function dump_table($table, $fp = null) { $need_close = false; if (is_null($fp)) { $fp = fopen($table . '.sql', 'w'); $need_close = true; } fwrite($fp, "-- \n-- {$table}\n-- \n"); $rs = mysql_query("SELECT * FROM `{$table}`"); while ($row = mysql_fetch_row($rs)) { fwrite($fp, get_insert_sql($table, $row)); } mysql_free_result($rs); if ($need_close) { fclose($fp); } fwrite($fp, "\n\n"); } function get_insert_sql($table, $row) { $sql = "INSERT INTO `{$table}` VALUES ("; $values = array(); foreach ($row as $value) { $values[] = "'" . mysql_real_escape_string($value) . "'"; } $sql .= implode(', ', $values) . ");\n"; return $sql; } function display_help() { echo <<<EOT syntax: php export_db.php database [-h hostname] [-c charset] [-f filename] [-u username] [-p] defualt hostname : localhost default charset : utf8 default username : root default password : (none) default filename : [database].sql EOT; } ?> |
|