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



总之你用 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

来源:网络