我有同样的问题,我知道解决方案。 我使用版本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
结果可能被切断。
我在10.2.0.5中看不到。你看到了哪个补丁级别(也许是平台)? –
[OP](https://github.com/theory/sqitch/issues/316)说:“Oracle版本:Oracle数据库10g企业版版本10.2.0.1.0 - 64位生产。” – theory
看来Rusty的回答是正确的。在这些功能中,*在Oracle中没有任何与“缓冲区分配”相关的参数。只有结果超过预期的结果类型(例如,4000 for varchar2就像这里),你会得到一个异常。 我在你的“bug报告”中给出的红色例子可以看到结果取决于表达式的长度。所以它看起来像SQL Plus的默认行为的未命名列。显示时裁剪结果。 尝试给该列提供别名并使用COLUMN命令设置适当的宽度。请参阅https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch6.htm –