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
)

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.


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


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.