我试图查看内存中存储的字符 ASCII 值,但它只会显示第一个字符 ASCII。我想要完成存储在内存中的 char 结构。
例如,列
name char(10)
我正在通过
"abc"
。
它应该显示 int 数组,如下所示:
67 68 69 32 32 32 32 32 32 32
这里的32代表“空格”
如果您只想查看存储的字节,请使用
dump()
,如果您愿意,它将以十进制或十六进制甚至八进制显示。 Bob 从该输出中仅提取字节的方法很有用,如果重要的话,您可以选择用空格替换逗号。
如果您确实想查看十六进制值,您也可以这样做:
select name,
cast(utl_raw.cast_to_raw(name) as varchar2(20)) as ascii
from your_table;
NAME ASCII
---------- ------------------------------
abc 61626320202020202020
作为获取十进制值的替代方法,您可以使用分层查询:
select name,
listagg(ascii(substr(name, level, 1)), ' ') within group (order by level) as ascii
from your_table
connect by level <= length(name)
group by name;
NAME ASCII
---------- ------------------------------
abc 97 98 99 32 32 32 32 32 32 32
尽管处理多行有点混乱,但与简单地转储值相比,这需要做相当多的工作。
对 Bob 的格式略有不同,只是为了准确获得您显示的格式(当然这实际上可能并不重要):
select name,
dump(name) as dumped,
trim(regexp_replace(dump(name), '((.*:)|,)', ' ')) as ascii
from your_table;
NAME DUMPED ASCII
---------- --------------------------------------------- ------------------------------
abc Typ=96 Len=10: 97,98,99,32,32,32,32,32,32,32 97 98 99 32 32 32 32 32 32 32
(除非您的字符集是 US7ASCII,否则它不是真正的 ASCII;它是数据库字符集中的十进制表示形式...但这种区别通常会被忽略。这些都将为您提供非 ASCII 字符的值 (> 127)不过。)
执行此操作的一种方法是
DUMP
字符串,然后从输出中获取字节代码列表:
SELECT SUBSTR(REGEXP_SUBSTR(DUMP('a b c d'), ':.*'), 3) FROM DUAL;
在你的情况下,你想做类似的事情
SELECT SUBSTR(REGEXP_SUBSTR(DUMP(YOUR_COLUMN_NAME), ':.*'), 3)
FROM YOUR_TABLE
祝你好运。