我有同樣的問題,我知道解決方案。 我使用版本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 –