Oracle

SQLPLUS 預設列寬

  • May 12, 2016

對於我幾乎所有的數據庫,當我執行一條SELECT語句時,顯示的列的長度會調整為被查詢數據的寬度。但是,我有兩個數據庫(同一應用程序的開發和生產)似乎將所有列大小預設為 32 個字元寬。如果數據寬於 32 個字元或使用了列別名,則預設該列為 128 個字元寬。

以下是來自眾多優秀系統之一的一些範例:

>select '1234567890' XX_Identifier from dual;

XX_IDENTIF
----------
1234567890

>select '12345678901234567890' XX_Identifier from dual;

XX_IDENTIFIER
--------------------
12345678901234567890

以下是其中一個不良系統的一些範例:

>select '1234567890' XX_Identifier from dual;

XX_IDENTIFIER
--------------------------------
1234567890

>select '12345678901234567890' XX_Identifier from dual;

XX_IDENTIFIER
--------------------------------
12345678901234567890

我檢查了 sqlplus 設置,它們都是一樣的。我沒有看到任何看起來不尋常的數據庫參數,它們都具有相同的 NLS 參數。兩個數據庫使用相同的字元集。

我意識到我可以為要查詢的每一列定義一種格式,但這不是必需的,因為它不在任何其他數據庫上。

有這個問題的數據庫是11.2.0.1,而我們其他的都是11.2.0.4,所以可能有一個我找不到的錯誤。在這兩種情況下,我使用的 sqlplus 客戶端都是 12.1.0.1。

更新:症狀不完全匹配,但 Doc ID 330717.1 談到了 sqlplus 中的列寬,基本上說如果不設置格式就不能保證任何事情。我可以接受,但由於行為是一致的,似乎可以確定原因。

我發現了這個問題。它記錄在一個 oracle note (Doc ID 1086519.1) 中。我使用列出的第一個解決方法是將 CURSOR_SHARING 設置為精確。

ALTER SESSION SET CURSOR_SHARING=EXACT; 

引用自:https://dba.stackexchange.com/questions/138361