我有一个这样的查询:$this->db->select("SELECT * FROM foo");
现在,如果表名是Foo
,并且我在MySQL上执行这个脚本,那么一切都很好(MySQL上的表名甚至是小写字母,所以:foo。如果我在表名为foo的Oracle上执行这个,请购买。我会得到:
SQLSTATE[42S02]:找不到基表或视图:1146表"test_db.foo"不存在
因为Oracle的istance被称为Foo而不是Foo。有什么办法解决这个问题吗?
[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将尊重你在表名中使用的大小写:
CREATE TABLE "tEsT" ( column_name NUMBER );
和:
SELECT * FROM USER_TABLES;
输出:
TABLE_NAME
----------
TEST
tEsT
(注意:现在有两个名为TEST
和tEsT
的表,oracle尊重第二个表的大小写敏感性,即用引号创建的表)。
(另请注意:SELECT * FROM tEsT
将从第一个表中选择,该表已转换为大写,但SELECT * FROM "tEsT"
需要从第二个表中进行选择,即使除了引号之外的查询是相同的)。