PHP脚本快速比较两个mysql表结构的差异

原创 2015年12月03日 17:17:32
事情的开头总是有原因的,由于项目数据库设计的时候没有长远考虑,总是不停的修改数据库.在一些应用上,总会有几个开发服务器,比如测试服务器~,外网服务器等等,而每次我修改的时候只改了本地的服务器数据库的结构,经常导致代码部署到外网测试服务器就挂了,调查了半天才发现是数据库差字段..然而每次的调查都很麻烦,看log,看日志.于是我写下了这段脚本.
<?php  
$dbname1="lzt";
$dbname2="lzt";
$dsn1="mysql:host=192.168.1.90;port=3306;dbname=".$dbname1;//数据库连接1
$dsn2="mysql:host=121.40.121.1;port=3306;dbname=".$dbname2;//数据库连接2


$db1=new PDO($dsn1,"root","fuck1314");
$db2=new PDO($dsn2,"root","fuck1314");
echo "------------------------------------------------------------------------------------------</br>";
echo "--------------------------表检查----------------------------------------------------------</br>";
$sql="show  tables";
$stmt1=$db1->query($sql);
$stmt1->setFetchMode(PDO::FETCH_NUM);
$rs1= $stmt1->fetchAll();

$stmt2=$db2->query($sql);
$stmt2->setFetchMode(PDO::FETCH_NUM);
$rs2= $stmt2->fetchAll();
$rs= check($rs1,$rs2);
//dump($rs);
Pr($rs);
echo "------------------------------------------------------------------------------------------</br>";
echo "数据格式:TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,CHARACTER_SET_NAME,COLUMN_KEY,EXTRA</br>";
echo "数据格式:表名,列名,列类型,是否允许空,字符编码集,属性,扩展</br>";
$sql="SELECT TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,CHARACTER_SET_NAME,COLUMN_KEY,EXTRA 
from information_schema.COLUMNS where  TABLE_SCHEMA=";
//比较表名,列名,列的类型,是否为空,字符编码,属性,扩展这几个属性.
$stmt1=$db1->query($sql."'".$dbname1."'");
$stmt1->setFetchMode(PDO::FETCH_NUM);
$rs1= $stmt1->fetchAll();

$stmt2=$db2->query($sql."'".$dbname2."'");
$stmt2->setFetchMode(PDO::FETCH_NUM);
$rs2= $stmt2->fetchAll();
$rs= check($rs1,$rs2);
Pr($rs);

//---------------------------------------------功能函数
//Print Array   其实没用上...
function dump($vars, $label = '', $return = false) {
    if (ini_get('html_errors')) {
        $content = "<pre>\n";
        if ($label != '') {
            $content .= "<strong>{$label} :</strong>\n";
        }
        $content .= htmlspecialchars(print_r($vars, true));
        $content .= "\n</pre>\n";
    } else {
        $content = $label . " :\n" . print_r($vars, true);
    }
    if ($return) { return $content; }
    echo $content;
    return null;
}
//Print Tbale   把结果用表格打印出来
function Pr($arr)
{
    $base="<div class=\"list\">
    <table width=\"454\"  border=\"1\" cellpadding=\"2\" cellspacing=\"1\">
        <col width=\"150\" />
        <col width=\"150\" />
        <tr>
            <th>DSN1</th>
            <th>DSN2</th>
        </tr>";
       foreach ($arr as $key => $value) {
            $v1=implode(",",$value['A']);
            $v2=implode(",",$value['B']);
            $base=$base."<tr>
            <td>$v1</td>        
            <td>$v2</td>                        
            </tr>";
        } 
        $base=$base." </table>";
        echo $base;
}
//数据检查  
function check($arr1,$arr2){
$arr3=array();
foreach ($arr1 as $key => $value) {
    if(!in_array($value,$arr2,true)){
        //如果A不在B里 则证明B里没有这个字段或表...则存起来.
        $arr3[]=array("A"=>$value,
            "B"=>array("null"));
    }
}
//逆向遍历一下.
foreach ($arr2 as $key => $value) {
    if(!in_array($value,$arr1,true)){

        $arr3[]=array("B"=>$value,
            "A"=>array("null"));
    }
}

return $arr3;
}

这就是结果图

运行方式也很简单,放在你的php服务器的webroot根目录,然后在浏览器调用一下就可以咯.

相信大家看到这段代码之后会觉得,怎么这么简单,我一开始是想去找工具的,没想到都要收费,所以就只能自己动手了..本文也提供了一些思路….如果你要比较table的数据得话,除了耗费的时间久一点,其他应该是没什么问题咯…

版权声明:本文为博主原创文章,转载请标明来自于http://blog.csdn.net/venusic。

Java-截取身份证号的生日

输入自己的身份证号码,并由此号码输出自己的生日,年月日。代码如下:package com.homework.lhh;import java.util.Scanner;public class Ex03...
  • blue_hh
  • blue_hh
  • 2017年07月24日 20:12
  • 367

20170505chrome插件控制页面跳转

chrome插件在新标签页打开自己附带的一个HTML页面在background.js中写入: //background.js chrome.browserAction.onClicked.addL...

比较两个mysql数据库表结构的差异

需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异。 数据库表结构的差异 注:操作均在Linux系统...

一个简单比较oracle两个用户下表数据差异的python脚本

分享一个脚本,用于比较数据差异。     日常工作中经常遇到这么一种情况,在数据迁移或者备份数据恢复等工作时,必须要比较两个用户下表的数据(主要是条数)是否一致,是否有漏数据的情况。虽然使用...
  • mhmds
  • mhmds
  • 2016年11月08日 18:09
  • 1042

两个数据库比较 对比视图存储过程及表结构差异

一、视图和存储过程比较【原理】利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比。系统表"sysobjects"之前有详细介绍过,有兴趣可以看看:...
  • lee576
  • lee576
  • 2014年02月19日 13:11
  • 4353

比较两个数据库的表结构差异

/*--比较两个数据库的表结构差异  http://blog.csdn.net/zjcxc/article/details/20088 --邹建 2003.9(引用请保留此信息)--*/ /*-...
  • zjg528
  • zjg528
  • 2013年03月24日 09:57
  • 390

两个数据库比较 对比视图存储过程及表结构差异

两个数据库比较 对比视图存储过程及表结构差异 一、视图和存储过程比较 【原理】利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比。系统表"...
  • cowbo
  • cowbo
  • 2016年06月28日 11:39
  • 1926

两个数据库比较 对比视图存储过程及表结构差异

sqlserver数据库表结构、存储过程、视图的比较脚本,并返回差异结果。

MYSQL比较两个数据库中表和字段的差异

MYSQL比较两个数据库中表和字段的差异
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP脚本快速比较两个mysql表结构的差异
举报原因:
原因补充:

(最多只允许输入30个字)