Perbedaan antara BYTE dan CHAR dalam tipe data kolom


166

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
)

Jawaban:


265

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.


55
Perhatikan bahwa semantik panjang karakter tidak mempengaruhi panjang maksimum 4000 byte untuk a VARCHAR2. Mendeklarasikan a VARCHAR2(4000 CHAR)akan memungkinkan kurang dari 4000 karakter jika beberapa karakter memerlukan beberapa byte penyimpanan.
Justin Cave

@ David Sykes Apakah ini secara semantik sama dengan NVARCHAR (11)?
Tidur

@Nap Tidak sejauh yang saya tahu. Saya percaya bahwa parameter ukuran dalam deklarasi tipe NVARCHAR memiliki arti seperti pada VARCHAR2. yaitu untuk memastikan ruang penyimpanan yang cukup untuk 11 karakter (bukan byte) di set karakter NVARCHAR Anda akan mengatakan NVARCHAR (11 CHAR). CATATAN: Saya belum benar-benar memeriksa ini. Saya belum pernah menggunakan NVARCHAR.
David Sykes

Untuk lebih menggambarkan perbedaan antara dua: empat karakter dari nilai hex-encoded (yaitu "0xFF") atau tiga karakter desimal (yaitu "255") dapat "dikompresi" ketika direpresentasikan sebagai byte tunggal: 11111111. Ini kemudian bisa berguna untuk flag bit (hingga 8 pengaturan), operasi bitwise, dll.
Matt Borja

Perhatikan bahwa 1 sebagai karakter ASCII (49 Desember) adalah 1001001 sedangkan 1 sebagai bit adalah 00000001.
Matt Borja


17

Bergantung pada konfigurasi sistem, ukuran CHAR yang diatur dalam BYTES dapat bervariasi. Dalam contoh Anda:

  1. Membatasi bidang hingga 11 BYTE
  2. Membatasi bidang hingga 11 aktor CHAR


Kesimpulan: 1 CHAR tidak sama dengan 1 BYTE.


4

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) .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.