我有这样的查询:$this->db->select("SELECT * FROM foo");
现在如果表名是Foo
,我在MySQL上执行这个脚本一切正常(MySQL上的表名甚至是小写字母,所以:foo。如果我在具有表名的Oracle上执行此操作,请购买作为Foo。我会得到:
SQLSTATE [42S02]:未找到基表或视图:1146表'test_db.foo'不存在
'因为Oracle的利益被称为Foo而不是foo。有些想法可以解决这个问题吗?
答案 0 :(得分:3)
[TL; DR]最简单的做法是永远不要在对象名称周围使用双引号,只让oracle以默认方式管理区分大小写。
默认情况下,Oracle数据库区分大小写;但是,默认情况下,它们还会将所有内容转换为大写字母,以便从用户那里抽象出区分大小写。
CREATE TABLE tEsT ( column_name NUMBER );
然后:
SELECT COUNT(*) FROM test;
SELECT COUNT(*) FROM Test;
SELECT COUNT(*) FROM TEST;
SELECT COUNT(*) FROM tEsT;
所有人都会给出相同的输出并且:
SELECT * FROM USER_TABLES;
输出:
TABLE_NAME
----------
TEST
(注意表名是大写的)。
如果你使用双引号,那么oracle将尊重你在表名中使用case:
CREATE TABLE "tEsT" ( column_name NUMBER );
和
SELECT * FROM USER_TABLES;
输出:
TABLE_NAME
----------
TEST
tEsT
(注意:现在有两个名为TEST
和tEsT
的表,oracle尊重第二个表的区分大小写 - 使用引号创建的表。)
(另请注意:SELECT * FROM tEsT
将从第一个表中进行选择,该表已转换为大写,但是SELECT * FROM "tEsT"
需要从第二个表中进行选择,即使查询是相同的,但是引号)。