Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:oracle_nls_length_semantics

Der Parameter NLS_LENGTH_SEMANTICS bei Oracle Datenbank mit einem Unicode Zeichensatz wie AL16UTF16/AL16UTF16

Über den Parameter „NLS_LENGTH_SEMANTICS“ wird das Verhalten der Datenbank beim Anlegen von varchar2 Spalten definiert.

Der Default Wert ist „BYTE“ , das heißt beim Anlegen einer Varchar2 Spalte wird für die Längen Angabe der Spalte die Anzahl der Bytes verwendet.

Das heißt aus der DDL Angabe „varchar2(10)“ wird eine Spalte mit dem Datentyp VARCHAR2 und der Byte Längen Angabe („data_length“ in der dba_tab_columns ) von 10 erstellt. Der sqlplus „describe“ Befehl zeigt als Zusatz zum Datentyp nichts, damit ist diese Spalte mit Byte definiert.

Steht der Wert auf „CHAR“, wird die Varchar2 Spalte mit der Länge angelegt, die notwendig ist die Anzahl von Zeichen beim eingestellten Zeichensatz der DB zu speichern.

Das heißt aus der DDL Angabe „varchar2(10)“ wird eine Spalte mit dem Datentyp VARCHAR2 und der Byte Längen Angabe („data_length“ in der dba_tab_columns ) von 40 erstellt. Der sqlplus „describe“ Befehl zeigt als Zusatz zum Datentyp nichts an, damit ist diese Spalte mit Byte definiert.

NLS_LENGTH_SEMANTICS kann global oder auf Session ebene gesetzt werden.

Einschränkung:

  • Im SYS Schema wird die Einstellung NLS_LENGTH_SEMANTICS beim Anlegen einer Tabelle ignoriert
  • Nicht dauerhaft verwenden! Besonders beim Einspielen von Oracle Optionen und Upgrade kann es zu ungewünschten Verhalten kommen.

Beispiel:

Setzen auf CHAR auf Session Ebene:

SQL>ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR;
 
SQL>CREATE TABLE gt ( a varchar2(10));
 
SQL>DESC gt
 
 Name      NULL?    TYPE             
 --------  -------- -----------------
 A                  VARCHAR2(10)
 
SQL>SELECT data_type,data_length FROM user_tab_columns WHERE TABLE_NAME ='GT';
 
 
DATA_TYPE    DATA_LENGTH
-----------  -----------
VARCHAR2     40

Setzen auf BYTE auf Session Ebene:

SQL>ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE;
 
SQL>CREATE TABLE gt ( a varchar2(10));
 
SQL>DESC gt
 
 Name      NULL?    TYPE             
 --------  -------- -----------------
 A                  VARCHAR2(10)
 
SQL>SELECT data_type,data_length FROM user_tab_columns WHERE TABLE_NAME ='GT';
 
 
DATA_TYPE    DATA_LENGTH
-----------  -----------
VARCHAR2     10

Typische Einsatz in der Praxis

Beim Import eines Datenbank Schemas aus einer WE8ISO Datenbank in die neue Unicode Umgebung wird folgender Fehler geworfen:

ORA-02374: conversion error loading table "GPITEST"."ILOCDB02"
ORA-12899: value too large for column STICHWORT (actual: 14, maximum: 12)
ORA-02372: data for row: STICHWORT : 'Lösungsworte'

Lösung: Schema wieder löschen, setzen von NLS_LENGTH_SEMANTICS auf CHAR, neu importieren

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/oracle_nls_length_semantics.txt · Zuletzt geändert: 2013/09/04 20:36 von Gunther Pippèrr