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

下载:export_db.rar

来源:网络