2016-09-29 64 views
6

我有一个bug report其中的Oracle 10g从to_char(datetime)截断返回值:Oracle 10g为什么要to_char(日期时间)截断字符串?

SQL> select to_char(systimestamp, '"day:"DD"hello"') from dual; 

TO_CHAR(SYSTIMESTAMP,'"DAY:"DD"HE 
--------------------------------- 
day:27hel 

值得注意的是,这并没有出现在Oracle 11g发生。我的问题是,为什么它会发生?是否有一些配置变量设置为告诉to_char(datetime)为其返回值分配更大的缓冲区?

+0

我在10.2.0.5中看不到。你看到了哪个补丁级别(也许是平台)? –

+0

[OP](https://github.com/theory/sqitch/issues/316)说:“Oracle版本:Oracle数据库10g企业版版本10.2.0.1.0 - 64位生产。” – theory

+1

看来Rusty的回答是正确的。在这些功能中,*在Oracle中没有任何与“缓冲区分配”相关的参数。只有结果超过预期的结果类型(例如,4000 for varchar2就像这里),你会得到一个异常。 我在你的“bug报告”中给出的红色例子可以看到结果取决于表达式的长度。所以它看起来像SQL Plus的默认行为的未命名列。显示时裁剪结果。 尝试给该列提供别名并使用COLUMN命令设置适当的宽度。请参阅https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch6.htm –

回答

3

我不确定,但它可能只是在SQL * Plus中显示。你有没有试过在蟾蜍中运行它?或者,如果您将结果赋值给PL/SQL块中的varchar2并输出结果?

这里是我在SQL * Plus参考已经找到的10G:

默认宽度和SQL格式化DATE列的格式* Plus的 由数据库NLS_DATE_FORMAT参数确定。否则, 的默认格式宽度是A9。有关格式化DATE列的更多信息,请参阅COLUMN 命令的FORMAT子句。

将您的值修剪为9个字符,这对应于默认的A9格式。我没有相同的版本,这种行为不是在11g中复制,所以你可以检查我的理论吗?

+0

谢谢,试图让[OP确认](https://github.com/theory/sqitch/issues/316#issuecomment-258007161)。 – theory

0

我有同样的问题,我知道解决方案。 我使用版本11.2.0.4.0,但我认为可以重复其他版本的情况。它以某种方式取决于客户。 (例如,我可以不使用SQL *重复加,只能用PL/SQL Devepoper) 试试这个:

select to_char(systimestamp, '"day:"DD"йцукенг OR any other UTF-encoded-something"') from dual 
union all 
select to_char(systimestamp, '"day:"DD"hello"') from dual; 

你会得到以下结果:

day:08йцукенг OR any other UTF-encoded-so 
day:08hello 

你可以看到“mething “丢失了。由于7个双字节符号“йцукенг”,这正好超过了7个字节。 Oracle为字符数分配缓冲区,而不是所需的字节数。 命令

alter session set nls_length_semantics=byte/char 

不幸的是不会影响这种行为。

所以我的解决办法是蒙上结果作为VARCHAR2(enough_capacity)

select cast(to_char(systimestamp, '"day:"DD"йцукенг OR any other UTF-encoded-something"') as varchar(1000)) from dual 
union all 
select to_char(systimestamp, '"day:"DD"hello"') from dual 

显式类型转换使得表达独立于客户端或配置。顺便说一句,同样的事情发生在所有隐式的to_char转换中。例如。

case [numeric_expression] 
when 1 then '[unicode_containing_string]' 
end 

结果可能被切断。

+0

*真的*希望这会起作用,但[显然不是](https://github.com/theory/sqitch/issues/316#issuecomment-262443669)。 :-( – theory

相关问题