Unterschied zwischen BYTE und CHAR in Spaltendatentypen

166

Was ist in Oracle der Unterschied zwischen:

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

und

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

Antworten:

265

Nehmen wir an, der Datenbankzeichensatz ist UTF-8. Dies ist die empfohlene Einstellung in neueren Versionen von Oracle. In diesem Fall benötigen einige Zeichen mehr als 1 Byte, um in der Datenbank gespeichert zu werden.

Wenn Sie das Feld als definieren VARCHAR2(11 BYTE), kann Oracle bis zu 11 Byte zum Speichern verwenden, aber Sie können möglicherweise nicht 11 Zeichen im Feld speichern, da einige von ihnen mehr als ein Byte zum Speichern benötigen, z. B. nicht englische Zeichen.

Wenn Sie das Feld so definieren, wie VARCHAR2(11 CHAR)Sie Oracle mitteilen, kann es genügend Speicherplatz zum Speichern von 11 Zeichen verwenden, unabhängig davon, wie viele Bytes zum Speichern der einzelnen Zeichen erforderlich sind. Ein einzelnes Zeichen kann bis zu 4 Bytes erfordern.

David Sykes
quelle
55
Beachten Sie, dass die Zeichenlängensemantik die maximale Länge von 4000 Byte für a nicht beeinflusst VARCHAR2. Wenn Sie a deklarieren, VARCHAR2(4000 CHAR)werden weniger als 4000 Zeichen zugelassen, wenn einige der Zeichen mehrere Byte Speicherplatz benötigen.
Justin Cave
@ David Sykes Ist das semantisch dasselbe mit NVARCHAR (11)?
Nap
@ Nick Nicht so weit ich weiß. Ich glaube, dass der Größenparameter in der NVARCHAR-Typdeklaration die Bedeutung wie in VARCHAR2 hat. Wenn Sie also genügend Speicherplatz für 11 Zeichen (keine Bytes) im NVARCHAR-Zeichensatz sicherstellen möchten, würden Sie NVARCHAR (11 CHAR) sagen. HINWEIS: Ich habe dies nicht überprüft. Ich habe NVARCHAR noch nie benutzt.
David Sykes
Zur weiteren Veranschaulichung des Unterschieds zwischen zwei: vier Zeichen eines hexadezimal codierten Werts (dh "0xFF") oder drei Dezimalzeichen (dh "255") könnte "komprimiert" werden, wenn es als einzelnes Byte dargestellt wird: 11111111. Dies könnte dann sein nützlich für Bit-Flags (bis zu 8 Einstellungen), bitweise Operationen usw.
Matt Borja
Beachten Sie, dass 1 als ASCII-Zeichen (Dez. 49) 1001001 ist, während 1 als Bit 00000001 ist.
Matt Borja
21

Einer hat genau Platz für 11 Bytes, der andere für genau 11 Zeichen. Einige Zeichensätze, wie z. B. Unicode-Varianten, verwenden möglicherweise mehr als ein Byte pro Zeichen. Daher kann das 11-Byte-Feld je nach Codierung Platz für weniger als 11 Zeichen bieten.

Siehe auch http://www.joelonsoftware.com/articles/Unicode.html

Matthias Kestenholz
quelle
17

Abhängig von der Systemkonfiguration kann die Größe des in BYTES gemessenen CHAR variieren. In Ihren Beispielen:

  1. Begrenzt das Feld auf 11 BYTE
  2. Begrenzt das Feld auf 11 CHAR- Akteure


Schlussfolgerung: 1 CHAR ist nicht gleich 1 BYTE.

user15453
quelle
4

Ich bin mir nicht sicher, da ich kein Oracle-Benutzer bin, aber ich gehe davon aus, dass der Unterschied darin liegt, dass Sie Multibyte-Zeichensätze wie Unicode (UTF-16/32) verwenden. In diesem Fall können 11 Bytes weniger als 11 Zeichen enthalten.

Auch diese Feldtypen können in Bezug auf Zeichen mit Akzent oder Groß- / Kleinschreibung unterschiedlich behandelt werden, z. B. stimmt 'binaryField (ete) = "été"' nicht überein, während 'charField (ete) = "été"' möglicherweise (wiederum nicht sicher über Oracle) übereinstimmt. .

Seldaek
quelle