2011-09-19 28 views
26
Ben şema bildiriminde altına alır kodları destekleyerek am

: - nvarchar2 (n BYTE | CHAR) varsayılan -> CHAR veya BYTE

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

Oracle belgelere & varchar2 sahiptir iki beyan modları varchar2 baktı (BYTE) ve varchar2 (n CHAR), Açıkça BYTE veya CHAR & belirtmezsem, sadece kullanıcı adı varchar2 (500) bildirilirse 500 BYTES veya 500 karakter atanır mı?

sayesinde

cevap

30

varsayılan sizin NLS_LENGTH_SEMANTICS parametre olarak ayarlanır edilecektir neyse. Varsayılan olarak, BYTE, karakter uzunluğundaki semantikleri kullanma seçeneğinin olmadığı eski Oracle sürümleriyle tutarlı olmalıdır. Kendi şemayı tanımlıyorsanız ve değişken genişlikli bir karakter kümesi kullanıyorsanız (AL32UTF8 gibi), hemen hemen her zaman bayt cinsinden olmayan karakter uzunluklarını belirtmeyi amaçladığınız için NLS_LENGTH_SEMANTICS CHAR ayarını öneririm.

+13

Bir VARCHAR sütun için ** CHAR NLS_LENGTH_SEMANTICS ayarı * * ** bayt 4000 limitini aşmak olmaz eklemek isteyebilirsiniz. –

+1

- [this] (https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams149.htm) sayfasında şunu yazıyor: _Dikkat: Oracle, NLS_LENGTH_SEMANTICS parametresini CHAR olarak ayarlamamanızı önerir. örnek veya sunucu parametre dosyasında. Bu, pek çok varolan yükleme komut dosyasının beklenmedik biçimde karakter uzunluğundaki semantiklere sahip sütunlar oluşturmasına neden olabilir; bu, arabellek taşmaları da dahil olmak üzere çalışma zamanı hatalarıyla sonuçlanır. Dediğiniz gibi, karakterlerin uzunluklarını her zaman belirtmek istediğiniz anlamına gelir. Bu gerçekten beni rahatsız ediyor. ne yapmalıyım, şimdi ve sonra bazı sütun boyutunu arttırmam gerek. – mkb

+2

@mkb - Parametre, oturum seviyesinde de ayarlanabilir. Parametreyi, düzey düzeyinde ayarlanma riskini istemiyorsanız, nesnelerini tanımlarken oturum seviyesinde ayarlayın. Ya da sadece bir Oracle kurulum komut dosyasını çalıştırmadan önce örnek seviyesinde BYTE'ye ayarlayın. –

8

Aşağıdaki sorguyu kullanarak geçerli değerini kontrol edebilirsiniz:

SELECT 
    value 

FROM 
    NLS_DATABASE_PARAMETERS 

WHERE 
    parameter='NLS_LENGTH_SEMANTICS'; 
+1

Onun 'değeri' değil 'val' –

+0

@Abhijith Made düzeltme. –