Eu tenho código para criar tabelas que não especificam a semântica de comprimento:
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
);
O código real é razoavelmente grande e contém centenas de objetos. Eu tenho duas versões do código que correspondem a diferentes revisões de controle de origem separadas por alguns anos.
Criei 2 usuários/esquemas no mesmo servidor com configurações idênticas. Em seguida, executo cada revisão em cada esquema respectivo. Para minha surpresa, a revisão mais recente recebe uma CHAR
semântica inesperada:
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)
Não consigo descobrir de onde CHAR
vêm!
- Não posso reproduzi-lo se eu executar o
CREATE TABLE
código isoladamente - Não consegui encontrar
ALTER TABLE CHAR_TEST
instruções em minha base de código que alterassem nada além de chaves ou índices SELECT value FROM V$PARAMETER WHERE NAME LIKE '%nls_length_semantics%';
imprimeBYTE
em ambos os esquemas
Você poderia sugerir onde procurar mais?
Esqueci o mais óbvio: os parâmetros da sessão podem ser alterados!
Eu tinha isso na última revisão:
... mas não o mais velho. Eu estava executando os scripts em uma sessão diferente, portanto, não consegui identificar a alteração de valor.