如何在SQL中查看存储的char ascii值

问题描述 投票:0回答:2

我试图查看内存中存储的字符 ASCII 值,但它只会显示第一个字符 ASCII。我想要完成存储在内存中的 char 结构。

例如,列

name char(10)

我正在通过

"abc"

它应该显示 int 数组,如下所示:

67 68 69 32 32 32 32 32 32 32

这里的32代表“空格”

database oracle
2个回答
4
投票

如果您只想查看存储的字节,请使用

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)不过。)


3
投票

执行此操作的一种方法是

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

SQLFiddle 在这里

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.