【问题标题】:Oracle SQL Developer lowercase identifiers for migrated DBs?迁移数据库的 Oracle SQL Developer 小写标识符?
【发布时间】:2023-04-03 04:37:01
【问题描述】:

我目前正在为特定客户端将基于 Code Igniter 的应用程序从 MySQL 移植到 Oracle (11g)。 MySQL 和 Oracle 后端都必须协同工作(即我们不能放弃其中一个)。 MySQL DB 使用大约 100 个表,其中所有标识符都是小写的。当我使用 Oracle 的 SQL Developer 工具将此数据库迁移到 Oracle 时,我最终得到了一个“正确”转换的数据库,但是......所有标识符都是大写的。

现在,对于正常使用来说,这并不是真正的问题,但是在使用 CI Active Record 类时会出现问题。它生成查询,效果如下: SELECT "somecolumn" FROM "sometable" WHERE "someothercolumn" = somevalue

问题在于,当这些标识符使用 " 引号时,Oracle 会强制以区分大小写的方式解释这些标识符,这在这种情况下会造成严重破坏。

修补 CI 和/或应用程序的核心代码以使所有查询都使用不区分大小写的标识符(即,通过删除标识符周围的 " 引号)或即时将所有标识符转换为大写标识符,是不希望 IMO,因为潜在的未来框架升级会受到影响。将所有 MySQL 标识符重命名为大写也是一个非常没有吸引力的场景,并且对应用程序本身产生更大的影响——这肯定不是一种选择。

相反,我想要实现的是让迁移过程(即使用 SQL Developer)简单地尊重源数据库的情况,并完全按照它现在所做的那样执行转换,除了标识符不会更改为大写版本。

我在网上搜索了一个公平的交易以找到实现此目的的方法,但到目前为止无济于事。

有谁知道这是否可以做到,如果可以:怎么做? 转换为所有大写标识符是否可能是全局数据库设置? 我会认为这是一件微不足道的事情,但到目前为止我还无法弄清楚,而且我确实遇到的一些相关参考资料听起来不太有希望......

【问题讨论】:

    标签: oracle codeigniter oracle-sqldeveloper database-migration uppercase


    【解决方案1】:

    如果您可以获得由数据库迁移创建的模式脚本,您只需将标识符(表名、视图名、列名等)更改为用双引号引起来。 (我不确定 SQL Developer 迁移是否真的可以选择保留案例)。

    如果没有引号,Oracle 将假定所有标识符都不区分大小写。但是,这在内部存储为数据字典中的大写字符串。通过使用引号将强制 Oracle 使用模式对象的确切大小写。

    例如。

    create table Customers
    ( 
      Name varchar2(100), 
      CreationDate date not null 
    );
    

    将在数据字典内部创建 CUSTOMERS,您可以编写如下查询:

    select name, creationdate from customers;
    

    或者:

    create table "Customers"
    ( 
      "Name" varchar2(100), 
      "CreationDate" date not null 
    );
    

    将在内部创建“客户”。您只能使用引号和大小写来编写查询:

    select "Name", "CreationDate" from "Customers";
    

    【讨论】:

    • 一件我忘了提的事情:我在 Oracle 论坛上看到一篇帖子,内容与您的建议差不多。它在这个线程中:forums.oracle.com/message/10199667 起初听起来很有希望,但在帖子 #6 附近,很明显这是一条麻烦的道路,而且不容易重复。鉴于如此广泛的“修补某些东西”,修补 CI 代码可能会更好。 :O 我仍然希望 SQL Developer 本身(我使用 v4.0)能够以某种方式被告知尊重标识符的大小写....
    • 是的,一个快速的谷歌显示这是使用 codeigniter/oracle 时的常见抱怨。如果不进入 codeigniter 源,似乎没有很多其他选择。
    【解决方案2】:

    我之前打过这个,简单地编辑了 oci8_driver.php (../system/database/oci) 如下:

    // The character used for excaping
    var $_escape_char = '"';
    

    // The character used for excaping
    var $_escape_char = '';
    

    斯图尔特

    【讨论】:

      最近更新 更多