2017-02-10 24 views
0

を使用してOracleにご理解の必要性MARIE-テレーズは、私が使用してOracle 12cにデータベースとテーブルを作成するNLS_LENGTH_SEMANTICS

INSERT INTO t (a) values ('MARIE-THÉRÈSE'); 

ERROR at line 1: 
ORA-12899: value too large for column "T"."A" (actual: 15, maximum: 
14) 

にいくつかの情報を:

SQL> SELECT LENGTH('MARIE-THÉRÈSE') "Length in characters" FROM DUAL; 

Length in characters 
-------------------- 
        15 
SQL> SELECT LENGTHB ('MARIE-THÉRÈSE') "Length in bytes" FROM DUAL; 

Length in bytes 
--------------- 
      23 
SELECT * 
    FROM nls_database_parameters 
    WHERE parameter = 'NLS_CHARACTERSET'; 

PARAMETER      VALUE 
------------------------------ -------------------- 
NLS_CHARACTERSET    AL32UTF8 

SELECT value FROM NLS_DATABASE_PARAMETER 
WHERE parameter='NLS_LENGTH_SEMANTICS'; 

VALUE 
----------------------------------- 
BYTE 

この列に「MARIE-THÉRESSE」を挿入する方法この列を変更せずにVARCHAR2(14 CHAR)唯一のoracleパラメータ?

+0

アクセント付きの各文字は2文字としてカウントされます。 'SQL>デュアルから長さ( 'È')を選択します。 LENGTH( '??') ------------ \t 2' – JSapkota

答えて

0

解決策は以下のとおりです。

VARCHAR2(20) : Uses the default length semantics defined by the NLS_LENGTH_SEMANTICS parameter which defaults to BYTE. 
VARCHAR2(20 BYTE) : Allows only the specified number of bytes to be stored in the column, regardless of how many characters this represents. 
VARCHAR2(20 CHAR) : Allows the specified number of characters to be stored in the column regardless of the number of bytes this equates to. 

SQL> CREATE TABLE tab2 (
    2 id   NUMBER(10), 
    3 description VARCHAR2(20 CHAR) 
    4 ); 
Table created. 

SQL> DESC tab2 
Name             Null? Type 
----------------------------------------------------- -------- ----------------- 
ID                NUMBER(10) 
DESCRIPTION             VARCHAR2(20 CHAR) 

データベースまたはセッションのデフォルトのキャラクタ・セマンティクスはNLS_LENGTH_SEMANTICSパラメータを使用して変更することができます。

ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR; 
ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=BYTE; 

ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR; 
ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE; 

我々は、文字へのセッションの長さセマンティクスを変更し、我々は変更が列の定義が表示されている方法によって影響を与えてきました見ることができるテーブルを記述した場合。

SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR; 

Session altered. 

SQL> desc tab1 
Name             Null? Type 
----------------------------------------------------- -------- ----------------- 
ID                NUMBER(10) 
DESCRIPTION             VARCHAR2(20 BYTE) 

SQL> DESC tab2 
Name             Null? Type 
----------------------------------------------------- -------- ----------------- 
ID                NUMBER(10) 
DESCRIPTION             VARCHAR2(20) 

SQL> 

INSTR、LENGTHおよびSUBSTR関数は、列定義と文字セットに関係なく、常に文字を処理します。特にバイトを処理する必要がある場合、OracleはINSTRB、LENGTHBおよびSUBSTRB関数を提供します。

0

LENGTH SEMANTICSパラメータは、DDLで指定しない場合、デフォルトで使用されるものを定義します。あなたは

CREATE TABLE T 
(a VARCHAR2(14)) 

を言うならば、列Aが14バイトまたは14個の文字である場合たとえば、その後、長さセマンティクスパラメータが決定されます。

例では、15文字の文字列があるため、長さの意味に関係なく、14文字の列に挿入することはできません。列定義を変更する必要があります。

ALTER TABLE T 
MODIFY a VARCHAR2(15 CHAR) 
+0

'MARIE-THÉRESSE'という文字列は13文字ではなく、15文字ではありません。この文字列を14桁の長さで挿入するように列の長さを変更したいですか? –

+0

@コバルトル。文字列を16進エディタにコピーすると、次のようになります。4D 41 52 49 45 2D 54 48 C3 89 52 C3 88 53 45.私のOracleと16進エディタは、それが15文字だと思っています。だから答えは変わっていない。あなたが長さを変更するものでなければ何もできません。なぜあなたはそんなに嫌なのですか? – BobC

+0

すべてのデータは、列が固定長である古いAS400からのものです。 Javaプログラムとsqlloaderを使用してOracleに送信するために、数百のテーブルを抽出する必要があります。これは、移行目的でワンショットで行われました。 Oracleで表を作成できるようにするには、AS400から表Structureを抽出します。この例では、列lenthはAS400で14です。 –

関連する問題