Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18672791
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-05-17 10:55:09

通常我们都用 phpMyAdmin 来导出,不过如果你的如果存在下列问题,那么 phpMyAdmin 也无能为力。

  • 数据库的字符集与应用程序的字符集不一致;
  • 应用程序用错误的编码将数据保存到了数据库中;
  • 用 phpMyAdmin 和 mysqldump 导出的数据总是乱码。

总之你用 phpMyAdmin 和 mysqldump 导出的数据有乱码时,就试试看这个脚本吧。

使用很简单:

php export_db.php 数据库名 [-h 主机名] [-c 字符集] [-f 输出文件名] [-u 用户名] [-p]  数据库名是必须提供的,参数如果没有提供则使用下面的默认值:     默认主机名 : localhost     默认字符集 : utf8     默认用户名 : root     默认密码 : (无)     默认输出文件 : 数据库名.sql 

这个脚本的导出结果就是一个 .sql 文件,只有 insert 语句。
所以数据结构需要单独导出,不过这个就不存在字符集问题了。

源:

  1. if (!function_exists('mysql_connect')) {
  2.     if (DIRECTORY_SEPARATOR == '/') {
  3.         dl('php_mysql.so');
  4.     } else {
  5.         dl('php_mysql.dll');
  6.     }
  7. }
  8. $database = null;
  9. if (isset($argv[1])) {
  10.     $database = $argv[1];
  11. } else {
  12.     display_help();
  13.     exit;
  14. }
  15. $optional_args = array(
  16.     '-h' => 'hostname',
  17.     '-c' => 'charset',
  18.     '-f' => 'filename',
  19.     '-u' => 'username'
  20. );
  21. $options = array(
  22.     'hostname' => 'localhost',
  23.     'charset' => 'utf8',
  24.     'filename' => '%s.sql',
  25.     'username' => 'root',
  26. );
  27. $input_password = false;
  28. for ($i = 2; $i < $argc; $i++) {
  29.     $arg = $argv[$i];
  30.     if ($arg == '-p') {
  31.         $input_password = true;
  32.         continue;
  33.     }
  34.     if (isset($optional_args[$arg])) {
  35.         $value_name = $optional_args[$arg];
  36.         if (isset($argv[$i + 1])) {
  37.             $options[$value_name] = $argv[$i + 1];
  38.             $i++;
  39.         }
  40.     }
  41. }
  42. if ($input_password) {
  43.     echo "password: ";
  44.     fscanf(STDIN, '%s', $password);
  45.     $options['password'] = $password;
  46.     echo "\n";
  47. } else {
  48.     $options['password'] = '';
  49. }
  50. if ($database == null) {
  51.     display_help();
  52.     exit;
  53. }
  54. mysql_connect($options['hostname'], $options['username'], $options['password']);
  55. mysql_select_db($database);
  56. mysql_query("SET NAMES '{$options['charset']}'");
  57. // 设置要导出的表
  58. $tables = list_tables($database);
  59. $filename = sprintf($options['filename'], $database);
  60. $fp = fopen($filename, 'w');
  61. foreach ($tables as $table) {
  62.     dump_table($table, $fp);
  63. }
  64. fclose($fp);
  65. mysql_close();
  66. echo "done.\n";
  67. exit;
  68. function list_tables($database)
  69. {
  70.     $rs = mysql_list_tables($database);
  71.     $tables = array();
  72.     while ($row = mysql_fetch_row($rs)) {
  73.         $tables[] = $row[0];
  74.     }
  75.     mysql_free_result($rs);
  76.     return $tables;
  77. }
  78. function dump_table($table, $fp = null)
  79. {
  80.     $need_close = false;
  81.     if (is_null($fp)) {
  82.         $fp = fopen($table . '.sql', 'w');
  83.         $need_close = true;
  84.     }
  85.     fwrite($fp, "-- \n-- {$table}\n-- \n");
  86.     $rs = mysql_query("SELECT * FROM `{$table}`");
  87.     while ($row = mysql_fetch_row($rs)) {
  88.         fwrite($fp, get_insert_sql($table, $row));
  89.     }
  90.     mysql_free_result($rs);
  91.     if ($need_close) {
  92.         fclose($fp);
  93.     }
  94.     fwrite($fp, "\n\n");
  95. }
  96. function get_insert_sql($table, $row)
  97. {
  98.     $sql = "INSERT INTO `{$table}` VALUES (";
  99.     $values = array();
  100.     foreach ($row as $value) {
  101.         $values[] = "'" . mysql_real_escape_string($value) . "'";
  102.     }
  103.     $sql .= implode(', ', $values) . ");\n";
  104.     return $sql;
  105. }
  106. function display_help()
  107. {
  108.     echo <<
  109. syntax:
  110.     php export_db.php database [-h hostname] [-c charset] [-f filename] [-u username] [-p]
  111.     defualt hostname : localhost
  112.     default charset  : utf8
  113.     default username : root
  114.     default password : (none)
  115.     default filename : [database].sql
  116. EOT;
  117. }
  118. ?>

下载:export_db.rar

阅读(449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~