表名以特殊字符结尾

g4u*_*r4v 3 oracle

我在数据库(oracle sql)中有一个表,它以某种方式在最后包含一个我不知道的特殊字符。我试图从它在表中的条目中获取该特殊字符tab

SQL> SELECT tname from tab where tname='OPERATION';

no rows selected

SQL> SELECT tname from tab where tname like 'OPERATION%';

TNAME
--------------------------------------------------------------------------------
OPERATION

SQL> SELECT length('OPERATION') from tab where tname like 'OPERATION%';

LENGTH('OPERATION')
------------------------
                       9

SQL> SELECT length(tname) from tab where tname like 'OPERATION%';

LENGTH(TNAME)
-------------
           10
Run Code Online (Sandbox Code Playgroud)

所以,Nstring 中的char 后面有一个特殊字符OPERATION。我尝试使用最后一个字符,substr但这没有帮助。

我怎样才能找到这个特殊ascii字符(甚至这个字符的价值)?

我怎样才能运行select这个表中的数据?

Mat*_*Mat 7

您可以尝试使用该dump函数来获取存储的实际字节值。例如,我刚刚创建了一个 table "OOUPS ",最后有一个空格。

> select table_name, dump(table_name) from user_tables;
...
OOUPS   Typ=1 Len=6: 79,79,85,80,83,32
...
Run Code Online (Sandbox Code Playgroud)

您可以看到 32 (0x20 hex) 作为最后一个字符 - 这是一个 ASCII 空间。

找到额外字符后,您可以在名称周围使用双引号查询表。这是区分大小写的,因此请确保您也匹配。例如:

create table "OOUPS " (a int);
insert into "OOUPS " (a) values (42);
commit;
select * from "OOUPS ";
Run Code Online (Sandbox Code Playgroud)

而且当然:

alter table "OOUPS " rename to more_sane_name;
Run Code Online (Sandbox Code Playgroud)

如果您不能轻松输入奇怪的字符,最简单的方法是创建一个 SQL 脚本,或者将确切的字符序列通过管道传输到 SQL*Plus:

OOUPS   Typ=1 Len=6: 79,79,85,80,83,13
Run Code Online (Sandbox Code Playgroud)
$ echo -e 'alter table "OOUPS\r" rename to saner_name;\nexit;' | sqlplus user/pass
...
Table altered.
Run Code Online (Sandbox Code Playgroud)