Oracle'daki varchar ve varchar2 arasındaki fark nedir?


Yanıtlar:


337

Şimdilik, eşanlamlılar.

VARCHAR, standart reçeteler olarak, gelecekte ve boş karakter dizisi arasındaki Oracleayrımı desteklemek için ayrılmıştır .NULLANSI

VARCHAR2NULLboş ve boş bir dize arasında ayrım yapmaz ve asla olmaz.

Boş dizeye güveniyorsanız ve NULLaynı şeyse, kullanmalısınız VARCHAR2.


40
Bu mantığı daha önce duymamıştı, bu yararlı. Teşekkürler. Kayıt için, Oracle'daki ana karakter türünün "varchar2" olması hala çok saçma. Bu korkunç bir çamur gibi kimseye çarpmıyor mu? Programlamayı öğrenmenin ilk haftasında nasıl bir problem çözerdim gibi görünüyor.
Ian Varley

7
@Ian: ana tür, VARCHAR2şu anda VARCHARolması gerektiği gibi davranan bir tür olmaması. Aslında, VARCHARdüzgün bir şekilde uygulanıncaya kadar hiç kullanmamalısınız .
Quassnoi

11
Teşekkürler @Quassnoi. Bu yüzden aptal kısım, Oracle'ın diğer tüm veritabanları gibi uygun bir VARCHAR'a sahip olmaması olduğunu tahmin ediyorum. Burada aptalca bir şeyler oluyor, bundan eminim ... :)
Ian Varley

11
@Ian: Oracle geliştirilirken standartlar yoktu. Standartlar ortaya çıktığında zaten eski uygulamalar yükü vardı. Nasıl olduğunu hepimiz biliyoruz.
Quassnoi

5
Maalesef, yanıtladığım yanlış yorumu yazan kişi @UnKnown oldu . Aslında where x is NULLgelen döner farklı sonuçlar where x = ''vermez değil anlamına NULLve ''herhangi bir şekilde farklı içindedir. Farklı davranış, =operatöre bağlıdır.
Dan Lenski


29

En son kararlı Oracle üretim sürümü 12.2'den alınmıştır: Veri Türleri

En büyük fark, VARCHAR2bir iç veri tipi ve VARCHARbir dış veri tipi olmasıdır . Bu nedenle, dahili ve harici bir veri türü arasındaki farkı anlamamız gerekir ...

Bir veritabanının içindeki değerler tablolardaki sütunlarda saklanır. Dahili olarak Oracle, dahili veri türleri olarak bilinen belirli formatlardaki verileri temsil eder .

Genel olarak, OCI (Oracle Call Interface) uygulamaları, verilerin dahili veri türü gösterimleriyle değil, yazıldıkları dil tarafından önceden tanımlanan ana bilgisayar dili veri türleriyle çalışır. Bir OCI istemci uygulaması ile bir veritabanı tablosu arasında veri aktarıldığında, OCI kitaplıkları verileri dahili veri türleri ve harici veri türleri arasında dönüştürür.

Harici türler, tescilli veri formatları yerine ana bilgisayar dili türleriyle çalışmayı mümkün kılarak programcıya kolaylık sağlar. OCI, bir Oracle veritabanı ve OCI uygulaması arasında veri aktarırken çok çeşitli veri türü dönüşümleri gerçekleştirebilir. Oracle dahili veri türlerinden daha fazla OCI harici veri türü vardır.

VARCHAR2Veri tipi 4000 bayt uzunluğu ile karakterlerin değişken uzunlukta dizedir. İnit.ora parametresi max_string_size varsayılansa, a'nın maksimum uzunluğu VARCHAR24000 bayt olabilir. İnit.ora parametresi max_string_size = uzatılmışsa, a'nın maksimum uzunluğu VARCHAR232767 bayt olabilir

VARCHARUzunluğu değişen veri türü depolar karakter dizeleri. İlk 2 bayt karakter dizesinin uzunluğunu ve kalan bayt dizeyi içerir. VARCHARBağlama veya tanımlı çağrıdaki dizenin belirtilen uzunluğu iki uzunluk baytı içermelidir, bu nedenle alınabilen veya gönderilebilen en büyük dize 65535 bayt uzunluğundadır, 65535 değil.

Bir 12.2 veritabanında hızlı bir testi olarak düşündürmektedir dahili veri türü Oracle hala davranır VARCHARbir şekilde psödotipinde için VARCHAR2. SYNONYMOracle'da gerçek bir nesne türü DEĞİLDİR .

SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production    

SQL> create table test (my_char varchar(20));
Table created.

SQL> desc test
Name                 Null?    Type
MY_CHAR                       VARCHAR2(20)

VARCHARProC / C ++ Precompiler seçeneklerinin bazı etkileri de vardır . İlgilenen programcılar için bağlantı şuradadır: Pro * C / C ++ Programcı Kılavuzu


1
yani bu VARCHARhâlâ tedavi ettiği anlamına '' == nullmı geliyor ?

2
Evet. Yukarıdaki dahili ve harici tiplerin tartışılması OCI referansından alınmıştır. 12.2 SQL dili başvuru hala aynı hep VARCHAR için olmuştur deyimi 'kullanmayın' taşır.
William Robertson

Bu yüzden OCI farklarını tartıştım, aksi takdirde gelecekteki kullanım için ya da çok baytlı UTF8 ... gibi karakter setlerinde ima edebilecek 'değişken uzunluk' dedikleri için ayrılmış durumda:
sandman

1
VARCHAR olarak bildirilen değerlerin veritabanında VARCHAR2 olarak depolandığını, ancak VARCHAR'ın maksimum uzunluğunun (65533 bayt) VARCHAR2'nin maksimum uzunluğundan (32767 bayt) daha büyük olduğunu gösterdiniz. Veritabanı bunu nasıl ele alıyor?
Piotr Dobrogost

IIRC, uzun zaman önce (Belki Oracle 6?) Uzay dolgusu için yanlış davranan bir VARCHAR tipi vardı - ya da boşlukları kesiyor muydu? AAR, cevap VARCHAR2 idi. Oracle, VARCHAR'ı geri getireceklerini söylüyor, ancak eminim, boş dize NULL DEĞİLSE dişleri gıcırdayacaktır.
JMD


0
  1. VARCHAR 2000 bayta kadar karakter saklayabilirken, VARCHAR2 4000 bayta kadar karakter depolayabilir.

  2. Veri tipini VARCHAR olarak ilan edersek NULL değerleri için yer kaplar. VARCHAR2 veri türü durumunda, NULL değerler için yer kaplamaz. Örneğin,

    name varchar(10)

adı 'Ravi__' olsa bile 6 bayt bellek ayıracak

name varchar2(10) 

giriş dizesinin uzunluğuna göre yer ayıracaktır. örneğin, 'Ravi__' için 4 bayt bellek.

Burada _, NULL değerini temsil eder.

NOT: varchar null değerler için yer ayırır ve varchar2 null değerler için yer ayırmaz.


2
Bu cevap kafa karıştırıcı düşünüyorum VARCHARile CHAR.
Jon Heller

0

Şu anda aynılar. ama önceden

  1. İnternette bir yerlerde bunu okudum,

VARCHAR, NULLANSI standardında öngörüldüğü üzere, Oracle tarafından gelecekte dize ve boş dize arasındaki farkı desteklemek üzere ayrılmıştır .

VARCHAR2NULLboş ve boş bir dize arasında ayrım yapmaz ve asla olmaz.

  1. Ayrıca,

Emp_name varchar(10)- 10 basamaktan küçük bir değer girerseniz, kalan boşluk silinemez. toplamda 10 boşluk kullandı.

Emp_name varchar2(10) - 10 basamaktan küçük bir değer girerseniz kalan alan otomatik olarak silinir


Son zamanlarda bu yazı tökezledi, lütfen yanlış olduğunu unutmayın. Aşağıdaki komutu uygulayın ve her iki alan da 3 karakter olacaktır:create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;
Brian Leach

-1

VARCHAR, VARCHAR2'nin eş anlamlısıdır. Ancak VARCHAR kullanmamalısınız çünkü Oracle gelecekte semantiklerini değiştirebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.