Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zeichensatzcodierungen und Speichergrößenfaktoren

Sofern Sie nicht nur an der maximalen Änderung interessiert sind, ist Ihr Beispiel nicht korrekt.

AL32UTF8 ist ein Zeichensatz variabler Länge. Allgemein gesagt, jedes Zeichen im US7ASCII-Zeichensatz benötigt 1 Byte, europäische Zeichen erfordern im Allgemeinen 2 Bytes, verschiedene asiatische Sprachzeichen erfordern 3 Bytes und eine Handvoll sehr seltener Zeichen benötigen 4 Bytes. Wenn Sie davon sprechen, tatsächliche WE8ISO8859P1-Daten in AL32UTF8 umzuwandeln, werden Sie in der Praxis im Allgemeinen einen Umrechnungsfaktor zwischen 1 und 2 sehen, der viel näher an 1 als an 2 liegt. Ohne die Unicode-Zuordnung für jedes gültige WE8ISO8859P1-Zeichen nachzuschlagen , ich wäre überrascht, wenn 3 oder 4 Byte Speicherplatz im AL32UTF8-Zeichensatz benötigt würden.

Im Globalization Support Guide gibt es einen Abschnitt zu Zeichensätze das sagt Ihnen, welche Zeichensätze Single-Byte-, welche Multi-Byte-Zeichensätze sind und welche der Multi-Byte-Zeichensätze feste Breite haben. Fast alle Multi-Byte-Zeichensätze haben eine variable Breite, sodass der Faktor, nach dem Sie suchen, von Ihren Daten abhängt.

In den meisten Fällen ist es besser, wenn Sie Ihre Spalten so deklarieren, dass sie Zeichenlängen-Semantik anstelle von Byte-Längen-Semantik verwenden, und die Datenbank hinter den Kulissen herausfinden lassen, wie viele Daten zugewiesen werden sollen. Zum Beispiel, wenn Sie eine Spalte deklarieren

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle weist Speicherplatz für 10 Zeichen zu, unabhängig vom Zeichensatz der Datenbank und unabhängig von der tatsächlichen Anzahl von Bytes, die zum Speichern dieser Daten erforderlich sind (vorbehaltlich der Beschränkung von 4000 Bytes pro VARCHAR2 Säule). Das macht das Definieren von Spaltengrößen im Allgemeinen viel einfacher, da Sie die Spalten nicht überdimensionieren müssen, falls jemand beschließt, 10 4-Byte-UTF-8-Zeichen in eine Zeile zu werfen, und Sie den Benutzern nicht erklären müssen, dass die Spalte akzeptiert wird Zeichenfolgen mit unterschiedlicher Anzahl von Zeichen, abhängig von der Sprache und/oder den ausgewählten spezifischen Zeichen.

Obwohl die Oracle-Leute, die sich regelmäßig mit Globalisierung befassen, davon abraten , wenn Sie es vorziehen, die Zeichenlängensemantik explizit anzugeben, wenn Sie Ihre Spalten deklarieren oder zumindest nur auf Sitzungsebene festlegen, können Sie den NLS_LENGTH_SEMANTICS Initialisierungsparameter um VARCHAR2(10) zu verursachen Zeichenlängensemantik statt Bytelängensemantik standardmäßig zu verwenden (Sie können immer noch VARCHAR2(10 BYTE) angeben). wenn Sie Byte-Längen-Semantik wünschen).