\n
通常我们都用 phpMyAdmin 来导出,不过如果你的数据库如果存在下列问题,那么 phpMyAdmin 也无能为力。
\n
- 数据库的字符集与应用程序的字符集不一致;
\n - 应用程序用错误的编码将数据保存到了数据库中;
\n - 用 phpMyAdmin 和 mysqldump 导出的数据总是乱码。
\n
\n
总之你用 phpMyAdmin 和 mysqldump 导出的数据有乱码时,就试试看这个脚本吧。
\n
使用很简单:
php export_db.php 数据库名 [-h 主机名] [-c 字符集] [-f 输出文件名] [-u 用户名] [-p]
数据库名是必须提供的,其他参数如果没有提供则使用下面的默认值:
默认主机名 : localhost
默认字符集 : utf8
默认用户名 : root
默认密码 : (无)
默认输出文件 : 数据库名.sql
\n
这个脚本的导出结果就是一个 .sql 文件,只有 insert 语句。
所以数据结构需要单独导出,不过这个就不存在字符集问题了。
\n
\n
源代码:
\n
\n
- <?php
\n
\n- if (!function_exists(‘mysql_connect’)) {
\n - if (DIRECTORY_SEPARATOR == ‘/’) {
\n - dl(‘php_mysql.so’);
\n - } else {
\n - dl(‘php_mysql.dll’);
\n - }
\n - }
\n
\n- database = null;
\n - if (isset(argv[1])) {
\n - database = argv[1];
\n - } else {
\n - display_help();
\n - exit;
\n - }
\n
\n- optional_args = array(
\n - ‘-h’ => ‘hostname’,
\n - ‘-c’ => ‘charset’,
\n - ‘-f’ => ‘filename’,
\n - ‘-u’ => ‘username’
\n - );
\n
\n- options = array(
\n - ‘hostname’ => ‘localhost’,
\n - ‘charset’ => ‘utf8′,
\n - ‘filename’ => ‘%s.sql’,
\n - ‘username’ => ‘root’,
\n - );
\n
\n- input_password = false;
\n - for (i = 2; i < argc; i++) {
\n - arg = argv[i];
\n - if (arg == ‘-p’) {
\n - input_password = true;
\n - continue;
\n - }
\n - if (isset(optional_args[arg])) {
\n - value_name = optional_args[arg];
\n - if (isset(argv[i + 1])) {
\n - options[value_name] = argv[i + 1];
\n - i++;
\n - }
\n - }
\n - }
\n
\n- if (input_password) {
\n - echo “password: “;
\n - fscanf(STDIN, ‘%s’, password);
\n - options[\'password\'] = password;
\n - echo “\\n”;
\n - } else {
\n - options[\'password\'] = ”;
\n - }
\n
\n- if (database == null) {
\n - display_help();
\n - exit;
\n - }
\n
\n- mysql_connect(options[\'hostname\'], options[\'username\'], options[\'password\']);
\n - mysql_select_db(database);
\n - mysql_query(“SET NAMES ‘{options[\'charset\']}’”);
\n
\n- // 设置要导出的表
\n - tables = list_tables(database);
\n
\n- filename = sprintf(options[\'filename\'], database);
\n - fp = fopen(filename, ‘w’);
\n - foreach (tables as table) {
\n - dump_table(table, fp);
\n - }
\n - fclose(fp);
\n - mysql_close();
\n - echo “done.\\n”;
\n - exit;
\n
\n
\n
\n- function list_tables(database)
\n - {
\n - rs = mysql_list_tables(database);
\n - tables = array();
\n - while (row = mysql_fetch_row(rs)) {
\n - tables[] = row[0];
\n - }
\n - mysql_free_result(rs);
\n - return tables;
\n - }
\n
\n- function dump_table(table, fp = null)
\n - {
\n - need_close = false;
\n - if (is_null(fp)) {
\n - fp = fopen(table . ‘.sql’, ‘w’);
\n - need_close = true;
\n - }
\n - fwrite(fp, “– \\n– {table}\\n– \\n”);
\n - rs = mysql_query(“SELECT * FROM {table}”);
\n - while (row = mysql_fetch_row(rs)) {
\n - fwrite(fp, get_insert_sql(table, row));
\n - }
\n - mysql_free_result(rs);
\n - if (need_close) {
\n - fclose(fp);
\n - }
\n - fwrite(fp, “\\n\\n”);
\n - }
\n
\n- function get_insert_sql(table, row)
\n - {
\n - sql = “INSERT INTO {table} VALUES (“;
\n - values = array();
\n - foreach (row as value) {
\n - values[] = “‘” . mysql_real_escape_string(value) . “‘”;
\n - }
\n - sql .= implode(‘, ‘, values) . “);\\n”;
\n - return sql;
\n - }
\n
\n- function display_help()
\n - {
\n - echo <<<EOT
\n- syntax:
\n - php export_db.php database [-h hostname] [-c charset] [-f filename] [-u username] [-p]
\n
\n- defualt hostname : localhost
\n - default charset : utf8
\n - default username : root
\n - default password : (none)
\n - default filename : [database].sql
\n
\n- EOT;
\n - }
\n
\n- ?>
\n