为什么Oracle吃我的字符串?

问题描述:

我现在尝试在Oracle数据库为什么Oracle吃我的字符串?

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names 

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

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

我试过它嵌套to_char()trim()但没有任何变化。我也尝试过不同的数据库,但它总是一样的。

有谁知道tz_offset和字符串连接是否有问题?

+0

看来你已经饿死了。定期给它的数据,它不会吃它不意味着的东西。 – 2011-06-01 20:26:47

+1

转载于Oracle 11g。 – 2011-06-02 01:35:51

执行以下查询:

select dump(tz_offset(tzname)) from v$timezone_names; 

你得到的结果类似这样:

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 
... 

这表明tz_offset()返回空值终止字符串(可能是错误)。因此,对于你的查询,甲骨文返回

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

有了这样的想法,我想,PL/SQL开发人员解释\ 0作为结束的字符串(也许另一个bug,SQL字符串不是空终止)和所以它不会打扰字符串的其余部分,所以你失去了尾随的大括号。 SQL * PLus选择打印一个空白字符而不是空字符,然后继续字符串的其余部分,打印右大括号。

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

+0

谢谢,非常好的解释! – Marcel 2011-06-01 13:41:45

+0

看起来像PL/SQL Developer特有的错误。 Oracle SQL Developer将\ 0显示为一个小方块,并显示任何附加到该字符串的字符。 – 2011-06-02 01:34:26

+0

@Jeffrey Kemp是的,但我认为'tz_offset()'在任何情况下都不应该返回以null结尾的字符串。 – gpeche 2011-06-02 10:21:25

它与子,但并没有真正回答你的问题,为什么它:-)发生的事情:

选择TZNAME || '(UTC'|| substr(tz_offset(tzname),1,6)||')'from v $ timezone_names;

我创建一个返回需要包括时区的时间戳JSON Ajax资源偏移......尾随控制字符是真的很烦我,我如果修剪掉如下:

REGEXP_REPLACE(TZ_OFFSET('加拿大/ Mountain'),'[[:cntrl:]]','')