为什么 Oracle 10g to_char(date time) 截断字符串?

Why Does Oracle 10g to_char(date time) Truncate Strings?

我得到一个 bug report,其中 Oracle 10g 截断了来自 to_char(datetime):

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

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

值得注意的是,Oracle 11g 似乎没有发生这种情况。我的问题是,为什么会发生这种情况?是否有一些配置变量可以设置为告诉 to_char(datetime) 为其 return 值分配更大的缓冲区?

我不确定,但它可能只是显示在 SQL*Plus 中。您尝试过在 Toad 中 运行 它吗?或者,如果您将结果分配给 PL/SQL 块中的 varchar2 并输出结果?

这是我在 SQL*Plus Reference for 10g 中找到的内容:

The default width and format of unformatted DATE columns in SQL*Plus is determined by the database NLS_DATE_FORMAT parameter. Otherwise, the default format width is A9. See the FORMAT clause of the COLUMN command for more information on formatting DATE columns.

您的值被裁剪为 9 个字符,对应于默认的 A9 格式。我没有相同的版本,并且此行为不会在 11g 中重现,所以您能检查一下我的理论吗?

我遇到了同样的问题,我知道解决办法。 我使用版本 11.2.0.4.0,但我相信在其他版本中可能会重复这种情况。它在某种程度上取决于客户。 (例如,我不能使用 SQL*Plus 重复它,只能使用 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-conversions 中。例如。

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

结果可能会被删减。