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
)
Guido
sumber

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.

David Sykes
sumber
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
21

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

Matthias Kestenholz
sumber
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.

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

Seldaek
sumber