【问题标题】:Would it be hard to switch from MySQL to Oracle?从 MySQL 切换到 Oracle 会很难吗?
【发布时间】:2009-08-14 03:12:54
【问题描述】:

下面是我如何运行 mysql 查询的一些示例代码,我通过一个我认为可能会简单地切换数据库的函数来运行它们。

下面是我运行的 mysql 查询示例,下面是实际函数。

如果我决定使用此设置,是否很难更改为其他数据库类型,如 oracle 或其他类型?

只能修改函数还是需要更改每个页面上的查询?

$sql_photo = "select * from friend_user_photo  where userid='$user_id' and  defaultphoto='yes' order by auto_id desc";
$result_photo = executeQuery($sql_photo);

function executeQuery($sql) {
    $result = mysql_query_2($sql);
    if(mysql_error()){
         $error = '<BR><center><font size="+1" face="arial" color="red">An Internal Error has Occured.<BR> The error has been recorded for review</font></center><br>';
        // If admin is viewing then we show the query code and the error returned
        if($_SESSION['auto_id'] == 1){
           $sql_formatted = highlight_string( stripslashes( $sql ), true );
           $error .= '<b>The MySQL Syntax Used</b><br>' . $sql_formatted . '<br><br><b>The MySQL Error Returned</b><br>' . mysql_error() ;
        }
       die($error);
    }
    return $result;
}

【问题讨论】:

    标签: mysql database oracle


    【解决方案1】:

    如果您坚持使用纯非专有 (ANSI) SQL,则无需修改任何查询。您可能使用专有扩展的一个例子是分页。如果您在 Web 应用程序中进行任何分页,很可能您使用的是这样的:

    select id, name, created from thing limit(0,20)
    

    该查询不适用于 Oracle,因为 limit 是 MySql 的专有扩展,您必须使用 Oracle 的 rownum 进行分页(只能接受一个参数),所以基本上您必须重写你的分页查询,如下所示:

    select * 
      from ( select /*+ FIRST_ROWS(n) */ 
      a.*, ROWNUM rnum 
          from ( your_query_goes_here, 
          with order by ) a 
          where ROWNUM <= 
          :MAX_ROW_TO_FETCH ) 
    where rnum  >= :MIN_ROW_TO_FETCH;
    

    还要考虑到您将使用 Oracle 扩展之一,因此您的数据库连接、操作和错误处理代码也必须重写 (example from the oci8 extension docs) 看起来更像:

    if ($c = oci_connect("hr", "hr_password", "localhost/XE")) {
       echo "Successfully connected to Oracle.";
       oci_close($c);
     } else {
       $err = oci_error();
       echo "Oracle Connect Error " . $err['text'];
     }
       // Select Data...
       $s = oci_parse($c, "select * from tab1");
       oci_execute($s, OCI_DEFAULT);
       while (oci_fetch($s)) {
         echo "COL1 = " . oci_result($s, "COL1") .
            ", COL2 = " . oci_result($s, "COL2") . "<br>\n";
       }
    

    如您所见,这绝非易事,尤其是在您拥有大量 MySql 硬连线代码的情况下。

    如果您的应用程序的可移植性是一个主要问题,您应该认真考虑使用允许您完全抽象出数据库供应商的库。我使用Zend_Db(顺便支持Oracle),但还有其他的。

    【讨论】:

    • 谢谢,它看起来比我想象的要难,也许看看支持多个数据库的软件也是一个可以研究的地方
    【解决方案2】:

    首先,您为什么希望能够切换数据库后端?这确实是很少需要的功能。

    其次,如果您希望数据库运行良好,您不能坚持使用 ANSII 标准查询。几乎所有可以优化数据库性能的方式都是特定于数据库供应商的。学习如何正确使用你拥有的后端比尝试制作它要好得多,这样你就可以随时切换到其他后端。

    第三,Oracle 的 SQl 版本与 MySQL 有很大不同,Oracle 数据库的管理要复杂得多。除非我聘请了 Oracle 专家,否则我不会考虑支持它。

    【讨论】:

    • 我只是在研究这个想法,你能解释一下“ANSII标准查询”是什么意思吗,我试过谷歌搜索,我不熟悉这个词,但什么也没找到
    • SQL 有一个ANSII 标准(google ansi 标准sql),它应该被大多数数据库使用。理论上,这意味着任何使用 SQL 的数据库都可以使用 ANSII 标准查询。在实践中,并没有那么多。数据库提供商倾向于使用他们自己的实现来扩展标准,这些实现会考虑到他们的底层架构,因此通常比标准更快地做同样的事情。
    • 好的,谢谢你的信息,我想也许 ANSII 标准是一件坏事,但我想不是
    【解决方案3】:

    “如果您的应用程序的可移植性是一个主要问题,您应该认真考虑使用允许您完全抽象出数据库供应商的库。”

    抱歉,我说这是一个根本解决不了问题的坏主意。将您的依赖关系从某个特定的 DBMS 供应商转移到某个特定的库供应商/供应商。事实证明,后者在 IT 环境中比 DBMS 供应商更稳定,不是吗?

    【讨论】:

    • @Erwin Smout - 好吧,你不同意我的最后一点,但你对 OP 问题的回答到底是什么?
    【解决方案4】:

    Oracle 确实有支持从 MySQL 迁移到 Oracle 的工具。它是their SQL Developer IDE 的扩展。

    【讨论】:

      【解决方案5】:

      “但是我们其他人应该将我们的应用程序调整为它们当前运行的数据库。”

      当我说“如果开发人员想要防范此类问题”时,我想我已经解决了这个问题。注意第一个单词“IF”。

      非常感谢一个实际上没有仔细阅读我的消息的人再次投反对票。

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 2016-09-01
        • 2013-07-16
        • 2014-01-29
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        相关资源
        最近更新 更多