自己写了一个数据库备份和恢复模块,备份的模块没有问题了,能正确输出创建表和插入数据的SQL语句。最终生成的sql文件和phpmyadmin导出的文件差不多一致,仅有编码不同。
(题外话,很奇怪,phpmadmin里看见的数据总是乱码,导出的文件也是,但程序里正确。但无论phpmyadmin里看到的数据库字符集还是程序代码页面、程序的数据库连接都是统一的utf-8编码。所以程序导出的正确编码的sql文件,用phpmyadmin导入后,phpmyadmin里看见是正确了,但程序里显示就又乱码了)但在数据导回上出了大问题,网上查了很多文章没有一个管用。抄来的正则看不懂,preg_match_all("/create table .*(.*).*;/ius",$content,$carr);这样的语句什么效果也没有,正则甚至连注释(/* 和*/之间)都没正确去除!自己又不会正则。我现在的想法就是用最简单的分割每条SQL语句逐条执行的办法导回数据。但问题又来了,不能简单的用;号分割SQL语句,因为数据内容可能也有;号。例如:
  CREATE   TABLE   yc_title   (
         `ID`   int(32) unsigned    auto_increment ,
         `topic_id`   int(16)     ,
         `title`   varchar(64)     ,
         `title_type`   varchar(32)     ,
         `title_min`   int(8)     ,
         `title_max`   int(8)     ,
         `title_value`   varchar(255)     ,
         `re`   varchar(255)     ,
         `group_id`   int(10) unsigned     ,
         `pic`   varchar(128)     ,
         `title_exp`   text     ,
         `PowerSet`   text     ,
  
  KEY `ID` (`ID`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;  INSERT   INTO   yc_title   VALUES   (    58 ,    23 ,    '进度' ,    'radio' ,    0 ,    0 ,    '' ,    '' ,    5 ,    NULL,    '洽谈;签付;加急;验收;终止;完成;结清' ,    '_Edit_Order'  );
输出时每行语句之间都有"\r\n "也就是换行分割,但是导入后用explode(';\r\n',$content)这样的语句也无法正确分割成数组,我该怎么办?

解决方案 »

  1.   

    其实我自己有个笨办法,就是导出SQL语句用别的特殊字符串分割,比如很长的一串不可能重复但容易读取的字符串分割,但这样就失去了对phpmyadmin的兼容。我还打算以后慢慢解决程序和phpmyadmin的编码问题后,就可以互相混用,那样就方便多了。附上一段导出SQL文件内容:/*-------------------------
     Group IN (20) 
     database : yjqcms 
     datetime : 2013-02-14 16:26:36
    -------------------------*/CREATE   TABLE   yc_admin   (
             `ID`   int(10) unsigned    auto_increment ,
             `group_id`   int(10) unsigned     ,
             `company`   varchar(64)     ,
             `admin`   varchar(32)     ,
             `pwd`   varchar(64)     ,
             `PowerSet`   text     ,
             `re`   text     ,
             `contact`   text     ,
             `usable`   tinyint(1)     ,
             `creater`   varchar(32)     ,
      
      KEY `ID` (`ID`)
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;  CREATE   TABLE   yc_content   (
             `ID`   int(32) unsigned    auto_increment ,
             `text_id`   varchar(32)     ,
             `title_id`   int(12)     ,
             `topic_id`   int(16)     ,
             `group_id`   int(10) unsigned     ,
             `expand_id`   int(16)     ,
             `usable`   tinyint(1)     ,
             `content`   text     ,
             `pic`   varchar(128)     ,
             `date`   timestamp     ,
      
      KEY `ID` (`ID`)
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
     
       INSERT   INTO   yc_content   VALUES   (    7965 ,    '58587527781' ,    664 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-19 15:15:21'  );
      INSERT   INTO   yc_content   VALUES   (    7964 ,    '58587527781' ,    663 ,    1012 ,    20 ,    NULL,    1 ,    '2013|6' ,    NULL,    '2013-01-19 15:15:21'  );
      INSERT   INTO   yc_content   VALUES   (    8060 ,    '58594930218' ,    686 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-24 15:15:14'  );
      INSERT   INTO   yc_content   VALUES   (    8111 ,    '58588634234' ,    655 ,    1011 ,    20 ,    NULL,    1 ,    '123123' ,    NULL,    '2013-01-22 14:14:04'  );
      INSERT   INTO   yc_content   VALUES   (    7963 ,    '58587527781' ,    662 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-19 15:15:21'  );
      INSERT   INTO   yc_content   VALUES   (    7999 ,    '58588634234' ,    68 ,    1011 ,    20 ,    NULL,    1 ,    '585886342' ,    NULL,    '2013-01-22 14:14:04'  );
      INSERT   INTO   yc_content   VALUES   (    7962 ,    '58587527781' ,    661 ,    1012 ,    20 ,    NULL,    1 ,    '测试公司' ,    NULL,    '2013-01-19 15:15:21'  );
      INSERT   INTO   yc_content   VALUES   (    7961 ,    '58587527781' ,    660 ,    1012 ,    20 ,    NULL,    1 ,    '58588634234' ,    NULL,    '2013-01-19 15:15:21'  );
      INSERT   INTO   yc_content   VALUES   (    8059 ,    '58594930218' ,    685 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-24 15:15:14'  );
      INSERT   INTO   yc_content   VALUES   (    8058 ,    '58594930218' ,    684 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-24 15:15:14'  );
      INSERT   INTO   yc_content   VALUES   (    8044 ,    '58594930218' ,    670 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-24 15:15:14'  );
      INSERT   INTO   yc_content   VALUES   (    8045 ,    '58594930218' ,    671 ,    1012 ,    20 ,    NULL,    1 ,    '0' ,    NULL,    '2013-01-24 15:15:14'  );
      INSERT   INTO   yc_content   VALUES   (    8046 ,    '58594930218' ,    672 ,    1012 ,    20 ,    NULL,    1 ,    '0' ,    NULL,    '2013-01-24 15:15:14'  );
      INSERT   INTO   yc_content   VALUES   (    8047 ,    '58594930218' ,    673 ,    1012 ,    20 ,    NULL,    1 ,    '' ,    NULL,    '2013-01-24 15:15:14'  );
      
      

  2.   

    回楼上,应该是一致的,目前问题就是没找到编码不一致的地方,这样的情况真奇怪。另关于如何导入SQL文件的问题,谁能帮帮忙想个办法。难道明知道每行语句有;号和换行分割了,也不能用PHP把每行语句分割出来吗?
      

  3.   

    问题大致解决了,用explode(";\r",$content)即可,必须是双引号(之前用单引号不行,可能是因为单引号中\r没有转义)还有一个小问题,就是去除/*和*/之间的内容就可以了(包括标签),这个应该有人会吧?
      

  4.   

      //去掉注释
      $noteLengh = strpos($content,'*/') + 2;
      $content =  substr($content, $noteLengh);  
      //替换前缀
      $content=str_replace("ct_",table_pre,$content);
      
      $arrCont = explode(";\r",$content);
    终于搞定了……不会正则真痛苦