为什么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
和字符串连接是否有问题?
执行以下查询:
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(...)
返回的空值。
它与子,但并没有真正回答你的问题,为什么它:-)发生的事情:
选择TZNAME || '(UTC'|| substr(tz_offset(tzname),1,6)||')'from v $ timezone_names;
我创建一个返回需要包括时区的时间戳JSON Ajax资源偏移......尾随控制字符是真的很烦我,我如果修剪掉如下:
REGEXP_REPLACE(TZ_OFFSET('加拿大/ Mountain'),'[[:cntrl:]]','')
看来你已经饿死了。定期给它的数据,它不会吃它不意味着的东西。 – 2011-06-01 20:26:47
转载于Oracle 11g。 – 2011-06-02 01:35:51