Oracle

找出長度語義發生變化的地方

  • November 18, 2015

我有程式碼來創建不指定長度語義的表:

CREATE TABLE CHAR_TEST (
   CHAR_TEST_ID NUMBER(*,0) NOT NULL,
   FOO VARCHAR2(6) NOT NULL,
   BAR VARCHAR2(6) NOT NULL,

   CONSTRAINT CHAR_TEST_PK PRIMARY KEY (CHAR_TEST_ID) ENABLE
);

實際程式碼相當大,包含數百個對象。我有兩個版本的程式碼,它們對應於相隔幾年的不同原始碼控製版本。

我在具有相同設置的同一台伺服器上創建了 2 個使用者/模式。然後我在每個各自的架構中執行每個修訂。令我驚訝的是,最新版本得到了意想不到的CHAR語義:

Name         Null     Type        
------------ -------- ----------- 
CHAR_TEST_ID NOT NULL NUMBER(38)  
FOO          NOT NULL VARCHAR2(6) 
BAR          NOT NULL VARCHAR2(6) 
Name         Null     Type        
------------ -------- ---------------- 
CHAR_TEST_ID NOT NULL NUMBER(38)  
FOO          NOT NULL VARCHAR2(6 CHAR) 
BAR          NOT NULL VARCHAR2(6 CHAR) 

我不知道這些是CHAR從哪裡來的!

  • CREATE TABLE如果我單獨執行程式碼,我無法重現它
  • 我一直無法ALTER TABLE CHAR_TEST在我的程式碼庫中找到更改鍵或索引以外的任何內容的語句
  • SELECT value FROM V$PARAMETER WHERE NAME LIKE '%nls_length_semantics%';``BYTE在兩種模式中列印

你能建議在哪裡看得更遠嗎?

我忘記了最明顯的事情:會話參數可以更改!

我在最新版本中有這個:

ALTER SESSION SET NLS_LENGTH_SEMANTICS = 'CHAR';

…但不是舊的。我在不同的會話中執行腳本,因此我無法發現值的變化。

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