通常我们都用 phpMyAdmin 来导出,不过如果你的数据库如果存在下列问题,那么 phpMyAdmin 也无能为力。
- 数据库的字符集与应用程序的字符集不一致;
- 应用程序用错误的编码将数据保存到了数据库中;
- 用 phpMyAdmin 和 mysqldump 导出的数据总是乱码。
总之你用 phpMyAdmin 和 mysqldump 导出的数据有乱码时,就试试看这个脚本吧。
使用很简单:
php export_db.php 数据库名 [-h 主机名] [-c 字符集] [-f 输出文件名] [-u 用户名] [-p]
数据库名是必须提供的,其他参数如果没有提供则使用下面的默认值:
默认主机名 : localhost
默认字符集 : utf8
默认用户名 : root
默认密码 : (无)
默认输出文件 : 数据库名.sql
这个脚本的导出结果就是一个 .sql 文件,只有 insert 语句。
所以数据结构需要单独导出,不过这个就不存在字符集问题了。
源代码:
- <?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']}'");
- // 设置要导出的表
- $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;
- }
- ?>