2008-09-17 6 views

Antwort

219

Nehmen wir an, der Datenbankzeichensatz ist UTF-8, was in den neuesten Versionen von Oracle empfohlen wird. In diesem Fall benötigen einige Zeichen mehr als 1 Byte zum Speichern in der Datenbank.

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

Indem Sie das Feld als VARCHAR2(11 CHAR) definieren, sagen Sie Oracle, dass es genügend Platz zum Speichern von 11 Zeichen haben kann, egal wie viele Bytes es dauert, um jedes zu speichern. Ein einzelnes Zeichen kann bis zu 4 Bytes benötigen.

+44

Beachten Sie, dass sich die Semantik der Zeichenlänge nicht auf die maximale Länge von 4000 Byte für ein 'VARCHAR2' auswirkt. Das Deklarieren von 'VARCHAR2 (4000 CHAR)' erlaubt weniger als 4000 Zeichen, wenn einige Zeichen mehrere Speicherbytes benötigen. –

+0

@David Sykes Ist das semantisch dasselbe mit NVARCHAR (11)? – Nap

+0

@Nap Nicht so weit ich weiß. Ich glaube, dass der Size-Parameter in der NVARCHAR-Typ-Deklaration die Bedeutung wie in VARCHAR2 hat. Um genügend Speicherplatz für 11 Zeichen (nicht Bytes) im NVARCHAR-Zeichensatz zu gewährleisten, würden Sie NVARCHAR (11 CHAR) sagen. HINWEIS: Ich habe das nicht überprüft. Ich habe NVARCHAR nie benutzt. –

19

Einem genauen Platz für 11 Bytes hat, die andere für genau 11 Zeichen. Einige Zeichensätze wie Unicode-Varianten können mehr als ein Byte pro Zeichen verwenden, daher kann das 11-Byte-Feld je nach Codierung Platz für weniger als 11 Zeichen haben.

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

3

Ich bin nicht sicher, da ich nicht ein Benutzer Oracle bin, aber ich nehme an, dass der Unterschied liegt, wenn Sie Multi-Byte-Zeichensätze wie Unicode (UTF-16/32) verwenden. In diesem Fall könnten 11 Bytes weniger als 11 Zeichen umfassen.

Auch diese Feldtypen können in Bezug auf akzentuierte Zeichen oder Groß-/Kleinschreibung anders behandelt werden, zum Beispiel 'binaryField (ete) = "été"' stimmt nicht überein, während 'charField (ete) = "été' 'könnte (wieder nicht sicher über Oracle).

15

Abhängig von der Systemkonfiguration, die Größe der CHAR mesured in BYTES variieren kann. In Ihre Beispiele:

  1. Limits Feld 11 BYTE
  2. Limits Feld 11 CHAR Ansager,


Fazit: 1 CHAR auf 1 Byte nicht gleich ist.

Verwandte Themen