Di Oracle, apa perbedaan antara:
CREATE TABLE CLIENT
(
NAME VARCHAR2(11 BYTE),
ID_CLIENT NUMBER
)
dan
CREATE TABLE CLIENT
(
NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
ID_CLIENT NUMBER
)
Mari kita asumsikan kumpulan karakter basis data adalah UTF-8, yang merupakan pengaturan yang direkomendasikan dalam versi terbaru Oracle. Dalam hal ini, beberapa karakter memerlukan lebih dari 1 byte untuk disimpan dalam database.
Jika Anda mendefinisikan bidang sebagai VARCHAR2(11 BYTE)
, Oracle dapat menggunakan hingga 11 byte untuk penyimpanan, tetapi Anda mungkin sebenarnya tidak dapat menyimpan 11 karakter di lapangan, karena beberapa di antaranya membutuhkan lebih dari satu byte untuk disimpan, misalnya karakter non-Inggris.
Dengan mendefinisikan bidang saat VARCHAR2(11 CHAR)
Anda memberi tahu Oracle, ia dapat menggunakan ruang yang cukup untuk menyimpan 11 karakter, tidak peduli berapa banyak byte yang diperlukan untuk menyimpan masing-masing. Satu karakter mungkin memerlukan hingga 4 byte.
VARCHAR2
. Mendeklarasikan aVARCHAR2(4000 CHAR)
akan memungkinkan kurang dari 4000 karakter jika beberapa karakter memerlukan beberapa byte penyimpanan.Satu memiliki tepat ruang untuk 11 byte, yang lain persis 11 karakter. Beberapa rangkaian karakter seperti varian Unicode dapat menggunakan lebih dari satu byte per karakter, oleh karena itu bidang 11 byte mungkin memiliki ruang kurang dari 11 karakter tergantung pada pengkodean.
Lihat juga http://www.joelonsoftware.com/articles/Unicode.html
sumber
Bergantung pada konfigurasi sistem, ukuran CHAR yang diatur dalam BYTES dapat bervariasi. Dalam contoh Anda:
Kesimpulan: 1 CHAR tidak sama dengan 1 BYTE.
sumber
Saya tidak yakin karena saya bukan pengguna Oracle, tetapi saya berasumsi bahwa perbedaannya terletak ketika Anda menggunakan set karakter multi-byte seperti Unicode (UTF-16/32). Dalam hal ini, 11 Bytes dapat mewakili kurang dari 11 karakter.
Juga jenis-jenis bidang tersebut mungkin diperlakukan berbeda dalam hal karakter atau huruf beraksen, misalnya 'binaryField (ete) = "été"' tidak akan cocok sementara 'charField (ete) = "été"' mungkin (sekali lagi tidak yakin tentang Oracle) .
sumber