nls_length_semantics
Oracle’ da bu değer text alanların data type’ını belirler. BYTE ya da CHAR olabilir. Default değer BYTE ‘dır.
Eskiden beri olan ISO karakter setlerinde her karakter 1 byte ile ifade edilir. Ankcak UTF-8 olarak bilinen Unicode karakter setlerinde bütün dillere ait özel karakterlerin tutulabilmesi için bazı karakterler 2 byte olarak saklanır. Örneğin İ,ı,ğ,ü,ö,ş,ç gibi Türkçe karakterler 2 byte olarak saklanır. Oracle 9 dan sonra gelen AL32UTF8 karakter setinde Oracle aynen bu şekilde davranır. Yani eğer
VARCHAR2(10 byte) bir alanı olan tablonuz varsa. Oraya “ışöçü” yazdığınızda alan dolacaktır. Bunu önlemek için VARCHAR2(10 char) olarak tanımlamanız gerekir.
Tablo yaratırken BYTE default değerini CHAR yapmak için “nls_length_semantics” değerini CHAR yapmalısınız.
ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR SCOPE=BOTH
VARCHAR2(10 byte) tanımını CHAR olarak değiştirmek için;
alter table TABLE_NAME modify ( FIELD_NAME VARCHAR2 ( 10 char ));
Eğer veritabanındaki bu şekilde mevcut tüm tablolarınızdaki tüm BYTE tanımlarını CHAR olarak değiştirmek isterseniz aşağıdaki script oluşturan SQL den yardım alabilirsiniz;
select ‘alter table ‘|| owner ||’.’ || table_name || ‘ modify ( ‘ || column_name || ‘ ‘ ||data_type || ‘ ( ‘ || data_length || ‘ char ));’
from dba_tab_columns
where table_name in (select table_name from dba_tables where tablespace_name in (‘FOTO’,’BAIS’,’OLDSTARS’,’STARS’,’LOG’,’INDEKS’))
and char_used = ‘B’
Ya da aşağıdaki pl/sql bloğu ile daha hızlı olarak direk komutları run edebilirsiniz.
declare
cursor tablolar is
select 'alter table ' || owner || '.' || table_name || ' modify ( ' || column_name || ' ' ||data_type || ' ( ' || data_length || ' char ))'
from all_tab_columns
where table_name in (select table_name from all_tables where tablespace_name in ('BAIS','LOG','INDEKS','OLDSTARS'))
and char_used = 'B'
and owner in ('SANTRAL');
stmt varchar2(512);
begin
open tablolar;
loop
fetch tablolar into stmt;
exit when tablolar%NOTFOUND;
begin
execute immediate stmt;
EXCEPTION
when Others then
raise_application_error(-20004, stmt);
end;
end loop;
end;
Recent Comments