Apa perbedaan antara varchar dan varchar2 di Oracle?

Jawaban:

337

Adapun sekarang, mereka adalah sinonim.

VARCHARdicadangkan oleh Oracleuntuk mendukung perbedaan antara NULLdan mengosongkan string di masa depan, seperti yang ANSIditentukan standar.

VARCHAR2tidak membedakan antara NULLstring kosong dan, dan tidak akan pernah.

Jika Anda mengandalkan string kosong dan NULLmenjadi hal yang sama, Anda harus menggunakannya VARCHAR2.

Quassnoi
sumber
40
Belum pernah mendengar alasan itu sebelumnya, itu berguna. Terima kasih. Sebagai catatan, masih sangat konyol bahwa tipe karakter utama dalam Oracle adalah "varchar2". Bukankah itu menyerang orang lain sebagai lumpur yang mengerikan? Sepertinya saya akan memecahkan beberapa masalah di minggu pertama saya belajar program.
Ian Varley
7
@Ian: tipe utama adalah VARCHAR2karena saat ini tidak ada tipe yang berperilaku seperti VARCHARseharusnya. Bahkan, Anda tidak boleh menggunakan VARCHARsama sekali sampai itu diterapkan dengan benar.
Quassnoi
11
Terima kasih, @Quassnoi. Jadi saya kira bagian yang bodoh adalah bahwa Oracle tidak memiliki VARCHAR yang tepat seperti setiap database lainnya, kalau begitu? Ada sesuatu yang bodoh terjadi di sini, saya yakin itu ... :)
Ian Varley
11
@Ian: ketika Oracle sedang dikembangkan, tidak ada standar. Pada saat standar muncul itu sudah memiliki beban aplikasi warisan. Kita semua tahu bagaimana itu terjadi.
Quassnoi
5
Maaf, sebenarnya @UnKnown yang menulis komentar yang salah yang saya jawab . Fakta bahwa where x is NULLhasil pengembalian yang berbeda dari where x = ''yang tidak berarti bahwa NULLdan ''dengan cara apapun yang berbeda. Perilaku yang berbeda disebabkan oleh =operator.
Dan Lenski
38

Saat ini VARCHAR berperilaku persis sama dengan VARCHAR2. Namun, jenis ini VARCHARtidak boleh digunakan karena dicadangkan untuk penggunaan di masa mendatang.

Diambil dari: Perbedaan Antara CHAR, VARCHAR, VARCHAR2

Brian
sumber
@ PhilipRego VARCHARtidak boleh digunakan. Saya mengeditnya
bugybunny
29

Diambil dari versi stabil terbaru produksi Oracle 12.2: Jenis Data

Perbedaan utama adalah bahwa itu VARCHAR2adalah tipe data internal dan VARCHARmerupakan tipe data eksternal . Jadi kita perlu memahami perbedaan antara tipe data internal dan eksternal ...

Di dalam database, nilai disimpan dalam kolom dalam tabel. Secara internal, Oracle merepresentasikan data dalam format tertentu yang dikenal sebagai tipe data internal .

Secara umum, aplikasi OCI (Oracle Call Interface) tidak bekerja dengan representasi tipe data data internal, tetapi dengan tipe data bahasa host yang telah ditentukan oleh bahasa di mana mereka ditulis. Ketika data ditransfer antara aplikasi klien OCI dan tabel database, perpustakaan OCI mengkonversi data antara tipe data internal dan tipe data eksternal.

Tipe eksternal memberikan kenyamanan bagi programmer dengan membuatnya mungkin untuk bekerja dengan tipe bahasa host alih-alih format data yang dipatenkan. OCI dapat melakukan berbagai konversi tipe data saat mentransfer data antara database Oracle dan aplikasi OCI. Ada lebih banyak tipe data eksternal OCI daripada tipe data internal Oracle.

The VARCHAR2tipe data adalah string variabel-panjang karakter dengan panjang maksimal 4000 byte. Jika parameter init.ora max_string_size adalah default, panjang maksimum VARCHAR2bisa 4000 byte. Jika parameter init.ora max_string_size = diperluas, panjang maksimum VARCHAR2bisa 32767 byte

The VARCHARstring tipe data toko karakter dari berbagai panjang. 2 byte pertama berisi panjang string karakter, dan byte lainnya berisi string. Panjang string yang ditentukan dalam ikatan atau panggilan define harus menyertakan dua byte panjang, sehingga VARCHARstring terbesar yang dapat diterima atau dikirim adalah panjang 65533 byte, bukan 65535.

Sebuah tes cepat dalam database 12.2 menunjukkan bahwa sebagai tipe data internal , Oracle masih memperlakukan VARCHARsebagai pseudotype untuk VARCHAR2. Ini BUKAN SYNONYMyang merupakan tipe objek aktual di Oracle.

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)

Ada juga beberapa implikasi VARCHARuntuk opsi ProC / C ++ Precompiler. Untuk programmer yang tertarik, tautannya ada di: Pro * C / C ++ Panduan Programmer

sandman
sumber
1
jadi apakah ini berarti VARCHARmasih memperlakukan '' == null?
2
Iya. Diskusi jenis internal vs eksternal di atas adalah dari referensi OCI. The 12,2 SQL Language Reference masih membawa sama 'tidak menggunakan' pernyataan itu selalu memiliki untuk VARCHAR.
William Robertson
Inilah sebabnya mengapa saya membahas perbedaan OCI, jika tidak cukup banyak dicadangkan untuk penggunaan di masa depan atau seperti yang mereka katakan 'panjang variabel' yang mungkin mengisyaratkan set karakter seperti multi-byte UTF8 ...
sandman
1
Anda menunjukkan bahwa nilai yang dinyatakan sebagai VARCHAR disimpan dalam database sebagai VARCHAR2 namun panjang maks VARCHAR (65533 bytes) lebih besar daripada panjang max VARCHAR2 (32767 bytes). Bagaimana cara database menangani ini?
Piotr Dobrogost
IIRC, dahulu kala (Mungkin Oracle 6?) Ada tipe VARCHAR yang bertingkah salah terhadap ruang padding - atau apakah itu memotong ruang? AAR, VARCHAR2 adalah jawabannya. Oracle telah mengatakan mereka akan mengembalikan VARCHAR tetapi, saya yakin, akan ada kertakan gigi ketika string kosong BUKAN NULL.
JMD
2

Setelah beberapa percobaan (lihat di bawah), saya dapat mengonfirmasi bahwa pada September 2017, tidak ada yang berubah sehubungan dengan fungsi yang dijelaskan dalam jawaban yang diterima : -

  1. Demo rextester untuk Oracle 11g: String kosong dimasukkan sebagaiNULLs untuk keduanyaVARCHAR danVARCHAR2.
  2. Demo LiveSQL untuk Oracle 12c: Hasil yang sama.

Alasan historis dari kedua kata kunci ini dijelaskan dengan baik dalam jawaban untuk pertanyaan yang berbeda .

Steve Chambers
sumber
0
  1. VARCHAR dapat menyimpan hingga 2000 byte karakter sedangkan VARCHAR2 dapat menyimpan hingga 4000 byte karakter.

  2. Jika kita mendeklarasikan datatype sebagai VARCHAR maka ia akan menempati ruang untuk nilai NULL. Dalam hal tipe data VARCHAR2, ia tidak akan menempati ruang apa pun untuk nilai NULL. misalnya,

    name varchar(10)

akan mencadangkan 6 byte memori walaupun namanya 'Ravi__', sedangkan

name varchar2(10) 

akan menyimpan ruang sesuai dengan panjang string input. mis., 4 byte memori untuk 'Ravi__'.

Di sini, _ mewakili NULL.

CATATAN: varchar akan menyediakan ruang untuk nilai nol dan varchar2 tidak akan menyediakan ruang untuk nilai nol.

Palak Jain
sumber
2
Saya pikir jawaban ini membingungkan VARCHARdengan CHAR.
Jon Heller
0

Saat ini, mereka sama. tapi sebelumnya

  1. Di suatu tempat di internet, saya membaca itu,

VARCHARdicadangkan oleh Oracle untuk mendukung perbedaan antara NULLdan mengosongkan string di masa depan, sesuai standar ANSI.

VARCHAR2tidak membedakan antara NULLstring kosong dan, dan tidak akan pernah.

  1. Juga,

Emp_name varchar(10)- jika Anda memasukkan nilai kurang dari 10 digit maka ruang yang tersisa tidak dapat dihapus. Ini menggunakan total 10 ruang.

Emp_name varchar2(10) - jika Anda memasukkan nilai kurang dari 10 digit maka ruang yang tersisa secara otomatis dihapus

Ramkumar P
sumber
Saya menemukan posting ini baru-baru ini, harap dicatat bahwa itu tidak benar. Jalankan bidang berikut dan kedua bidang akan menjadi 3 karakter: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 adalah sinonim dari VARCHAR2. Namun, Anda sebaiknya tidak menggunakan VARCHAR karena Oracle dapat mengubah semantiknya di masa depan.

Premraj
sumber