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
)
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.
VARCHAR2
. Wenn Sie a deklarieren,VARCHAR2(4000 CHAR)
werden weniger als 4000 Zeichen zugelassen, wenn einige der Zeichen mehrere Byte Speicherplatz benötigen.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
quelle
Abhängig von der Systemkonfiguration kann die Größe des in BYTES gemessenen CHAR variieren. In Ihren Beispielen:
Schlussfolgerung: 1 CHAR ist nicht gleich 1 BYTE.
quelle
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. .
quelle