我的数据库中有一个名为"libisatz"的表,没有表,也没有名称为"libiSatz"的视图(用大写S代替s),而且在我的模式中找不到有名称"libiSatz"的任何类型的对象。但是,令人惊讶的是,从"libiSatz"中进行选择会得到与我编写"libisatz"相同的结果。如果我将这个名字中的任何其他字母从小写改为大写(例如,我写"Libisatz" ),那么我会得到一个错误。这怎么可能?
增编
我检查了乔恩·海勒的想法,结果如下:
select * from DBA_OBJECTS where OBJECT_NAME like 'libi_atz';和select * from DBA_OBJECTS where lower(OBJECT_NAME) = 'libisatz';都返回一行(是"libisatz"表)select * from DBA_OBJECTS where OBJECT_NAME = 'libisatz';返回一行,select * from DBA_OBJECTS where OBJECT_NAME = 'libiSatz';不返回行。ORA-00942: table or view does not exist的结果是
select * from DBA_SQL_TRANSLATIONS;和select * from DBMS_ADVANCED_REWRITE;select * from DBA_REWRITE_EQUIVALENCES;导致no rows selectedselect DUMP(OBJECT_NAME) from DBA_OBJECTS where lower(OBJECT_NAME) = 'libisatz';返回Typ=1 Len=8: 108,105,98,105,115,97,116,122因此,这个难题似乎还没有解决。
增编2.
"libiSatz"的视图时ORA-00955: name is already used by an existing object
尽管有上述结果,但
"libiSatz"改名为"oraclepuzzle"之后,select count(*) from "libisatz";和"select count(*) from "oraclepuzzle";工作,但select count(*) from "libiSatz";不工作。
使用"oraclepuzzle". select * from dba_objects where object_name in ( 'oraclepuzzle', 'libisatz', 'libiSatz');返回一行
发布于 2020-09-26 04:25:50
您是否有SQL翻译、重写等效项或UTF8字符?
构建SQL转换框架是为了允许为其他数据库类型设计的应用程序能够无缝地查询。但是,这个特性也可以用来悄悄地更改查询,而不是翻译语法。例如,here是查询不存在的表以解决表大小限制的一个示例。检查视图DBA_SQL_TRANSLATIONS。
重写等价物可以由包DBMS_ADVANCED_REWRITE创建,并且可以用于静默地更改错误查询的结果或一些罕见的性能问题。(在我的简单测试中,我无法让这个查询对无效的查询起作用,但我敢打赌有一种方法可以使它工作。)检查视图DBA_REWRITE_EQUIVALENCES。
UTF8字符可能被静默地替换为类似的ASCII字符。这可能取决于数据库和客户端字符集设置。下面的例子显然不是ASCII "S",但是您可能有一个更微妙的问题。检查值的来源,手动重新键入它们,并使用DUMP函数计算字符的二进制值。
SQL> create table "libisatz"(a number);
Table created.
SQL> -- An uppercase "S" does not work
SQL> select * from "libiSatz";
select * from "libiSatz"
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> -- But a "LATIN SMALL LETTER S WITH CARON" works.
SQL> select * from "libišatz";
no rows selected最后,您是否100%确定数据库中不存在该对象?上面的例子是可能的,但非常罕见。三次检查DBA_OBJECTS.OBJECT_NAME的神秘物体。
发布于 2020-09-25 16:40:33
我的耳聋Oracle对象名称不区分大小写。
因此,当您发出teh命令时:
CREATE TABLE the_table ..
CREATE TABLE The_Table ..
CREATE TABLE THE_TABLE ..
所有情况下的底层对象名称都是THE_TABLE,但是您可以使用大小写的任意组合来访问它:
SELECT * FROM THE_TABLE
SELECT * FROM tHe_TaBlE
SELECT * FROM the_table
一切都会起作用。
当用双引号包装的名称创建表时,名称就会区分大小写.
所以,如果你发布:
CREATE TABLE "libiSatz" ..
然后,所有SQL语句中的表名必须与双引号中的确切名称匹配,即
SELECT * FROM "libiSatz"是好的(更正以下评论)
SELECT * FROM libisatz不好
SELECT * FROM LibiSatz不好
在USER_OBJECTS或USER_TABLES中搜索此名称时,必须匹配创建名称:
SELECT * FROM USER_OBJECTS WHERE OBJECT_NAME = 'libiSatz';
https://stackoverflow.com/questions/64066126
复制相似问题