2011-09-19 10 views
26

popieram kod, który ma poniżej deklaracji schematu: -varchar2 (n BYTE | CHAR) domyślne -> CHAR lub BYTE

create table sample (
     id number Primary key, 
     username varchar2(100), 
); 

Spojrzałam na dokumentacji Oracle & VARCHAR2 posiada dwa tryby deklaracji varchar2 (n BYTE) i varchar2 (n CHAR), jeśli nie określiłem jawnie BYTE lub CHAR & po prostu zadeklaruję nazwę użytkownika varchar2 (500), to czy 500 bajtów zostanie przydzielonych lub 500 znaków?

Dzięki,

Odpowiedz

30

Domyślną będzie bez względu na parametr NLS_LENGTH_SEMANTICS jest ustawiony. Domyślnie jest to BYTE, aby zachować spójność ze starszymi wersjami Oracle, w których nie było opcji używania semantyki długości znaków. Jeśli definiujesz własny schemat i używasz zestawu znaków o zmiennej szerokości (np. AL32UTF8), zdecydowanie zaleciłbym ustawienie NLS_LENGTH_SEMANTICS na CHAR, ponieważ prawie zawsze chciałeś określać długości znaków nie w bajtach.

+13

Czasami warto dodać, że ustawienie NLS_LENGTH_SEMANTICS char * nie będzie przezwyciężyć limit 4000 bajtów ** ** dla kolumny VARCHAR. –

+1

na [this] (https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams149.htm) strona zawiera: _ Ostrzeżenie: Oracle zdecydowanie zaleca, aby NIE ustawiać parametru NLS_LENGTH_SEMANTICS na CHAR w pliku instancji lub pliku parametrów serwera. Może to spowodować nieoczekiwane utworzenie przez wiele istniejących skryptów instalacyjnych kolumn z semantyką długości znaków, co spowoduje błędy w czasie wykonywania, w tym przepełnienie bufora._ Jak już powiedziałeś, prawie zawsze ma to na celu określenie długości znaków. To naprawdę mnie zniechęca. co powinienem wiedzieć, od czasu do czasu muszę zwiększyć rozmiar kolumny. – mkb

+2

@mkb - Parametr można ustawić również na poziomie sesji. Ustaw parametr na poziomie sesji podczas definiowania obiektów, jeśli nie chcesz, aby było ustawione na poziomie instancji. Lub po prostu ustaw ją na poziomie instancji z powrotem do BYTE przed uruchomieniem skryptu instalacyjnego Oracle. –

8

Można sprawdzić aktualną wartość za pomocą następującego zapytania:

SELECT 
    value 

FROM 
    NLS_DATABASE_PARAMETERS 

WHERE 
    parameter='NLS_LENGTH_SEMANTICS'; 
+1

Jego "wartość", a nie "val" –

+0

@Abhijith Dokonano korekty. –