Sütun veri tiplerinde BYTE ve CHAR arasındaki fark


166

Oracle'da aşağıdakiler arasındaki fark nedir:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

ve

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

Yanıtlar:


265

Veritabanı karakter kümesinin, Oracle'ın son sürümlerinde önerilen ayar olan UTF-8 olduğunu varsayalım. Bu durumda, bazı karakterlerin veritabanında saklanması 1 bayttan fazla zaman alır.

Alanı olarak tanımlarsanız VARCHAR2(11 BYTE), Oracle depolama için en fazla 11 bayt kullanabilir, ancak bazılarında alanda 11 karakter depolayamayabilirsiniz, çünkü bazılarının saklanması birden fazla bayt alır, örneğin İngilizce olmayan karakterler.

VARCHAR2(11 CHAR)Oracle'a söylediğiniz gibi alanı tanımlayarak, her birini saklamak için kaç bayt olursa olsun 11 karakteri saklamak için yeterli alan kullanabilir. Tek bir karakter 4 bayta kadar gerektirebilir.


55
Karakter uzunluğu semantiğinin a için 4000 baytlık maksimum uzunluğu etkilemediğini unutmayın VARCHAR2. Bir VARCHAR2(4000 CHAR)karakterin tanımlanması, bazı karakterler birden fazla bayt depolama alanı gerektiriyorsa 4000 karakterden daha azına izin verir.
Justin Cave

@David Sykes Bu, anlamsal olarak NVARCHAR (11) ile aynı mıdır?
Şekerleme

@Nap Bildiğim kadarıyla değil. NVARCHAR tip bildirimindeki size parametresinin VARCHAR2'deki gibi olduğuna inanıyorum. yani NVARCHAR karakter kümesinde 11 karakter (bayt değil) için yeterli depolama alanı sağlamak için NVARCHAR (11 CHAR) diyebilirsiniz. NOT: Aslında bunu kontrol etmedim. NVARCHAR'ı hiç kullanmadım.
David Sykes

İkisi arasındaki farkı daha fazla açıklamak için: onaltılık kodlu bir değerin dört karakteri (yani "0xFF") veya üç ondalık karakteri (yani "255") tek bir bayt olarak temsil edildiğinde "sıkıştırılabilir": 11111111. bit bayrakları (8 ayara kadar), bitsel işlemler vb. için yararlı olabilir.
Matt Borja

ASCII karakteri olarak 1 (dec. 49) 1001001, 1 olarak 1 00000001'dir.
Matt Borja


17

Sistem yapılandırmasına bağlı olarak, BYTES içinde ölçülen CHAR boyutu değişebilir. Örneklerinizde:

  1. Alanı 11 BYTE ile sınırlar
  2. Alanı 11 CHAR oyuncusu ile sınırlar


Sonuç: 1 CHAR, 1 BYTE'ye eşit değildir.


4

Bir Oracle kullanıcısı olmadığımdan emin değilim, ancak Unicode (UTF-16/32) gibi çok baytlı karakter kümelerini kullandığınızda farkın yattığını varsayıyorum. Bu durumda, 11 Bayt 11 karakterden daha azını oluşturabilir.

Ayrıca, bu alan türleri aksanlı karakterler veya büyük / küçük harfe göre farklı şekilde ele alınabilir, örneğin 'binaryField (ete) = "été"' eşleşmezken 'charField (ete) = "été"' (yine Oracle hakkında emin değilim) .

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.