为什么Oracle会吃我的字符串?

Mar*_*cel 8 oracle oracle10g plsqldeveloper

我目前尝试在Oracle DB上执行以下查询

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names
Run Code Online (Sandbox Code Playgroud)

它似乎并不复杂.只是timzone的名称和大括号中的UTC偏移量.但是当我在Windows上使用PL/SQL Developer执行查询时,它总是会吃掉最后一个大括号.

所以我去了sqlplus并在那里执行了,现在我得到了我的最后一个大括号,但在最后一个大括号之前还有一个额外的空格作为额外的好东西.

我和嵌套尝试过to_char()trim(),但没有改变.我也尝试过不同的DB,但它总是一样的.

有人知道是否存在tz_offset字符串连接问题?

gpe*_*che 7

发出以下查询:

select dump(tz_offset(tzname)) from v$timezone_names;
Run Code Online (Sandbox Code Playgroud)

你得到这样的结果:

Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
...
Run Code Online (Sandbox Code Playgroud)

这表明tz_offset()返回以null结尾的字符串(可能是一个bug).因此,对于您的查询,Oracle正在返回

"Africa/Algiers (UTC+01:00\0)" // Note \0 -> null character
"Africa/Cairo (UTC+03:00\0)" // Note \0 -> null character
...
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,我想PL/SQL Developer将\ 0解释为字符串结尾(可能是另一个错误,SQL字符串不是以空值终止的),所以它不会打扰写字符串的其余部分,所以你输了尾随支架.SQL*PLus选择打印空格而不是那个空格,然后继续字符串的其余部分,打印右括号.

作为解决方法,您可以替换tz_offset(...)replace(tz_offset(...), chr(0)).这将从任何tz_offset(...)返回中删除空值.