<script type="text/javascript"><!--
google_ad_client = "pub-0241434510974184";
/* auto-http.cn 右边 ,468x60 */
google_ad_slot = "0902256228";
google_ad_width = 468;
google_ad_height = 60;
// --></script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
通常我们都用 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 " ";
} 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"]}"");

echo $options["hostname"];
echo " ";
echo $options["username"];
echo " ";
echo $options["password"];
echo " ";
echo $database;
echo " ";

// 设置要导出的表
$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. ";
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, "-- -- {$table} -- ");
$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, " ");
}

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) . "); ";
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;
}

?>
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。