7

以下は、非常に単純なテーブルで設定する SQL です。

CREATE TABLE CC_TEST2 
  ("CURRENCYID" NUMBER NOT NULL ENABLE, 
"NAME" NVARCHAR2(255)) ;


insert into CC_TEST2 (select 1,'Testing issue'from dual);
commit;

次に、これにより問題が再現されます

    SELECT (step.Name ||
    'Commentary of 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890            1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 12')
 as thing  FROM CC_TEST2 step

何か案は?

nVarchar2 について何かおかしいと思いますか? 列の型を varChar2 に変更すれば問題ありません。残念ながら、問題が発生している実際の運用データベースの列の種類を変更することはできません

4

3 に答える 3

2

"NAME" NVARCHAR2(255) が "NAME" VARCHAR2(255) に変更された場合 (つまり、varchar2 を使用して)、問題は発生しません。http://sqlfiddle.com/#!4/cefd8/2で同じことをテストできます

于 2013-10-23T09:39:22.797 に答える
0

オラクルのドキュメントによると

NCHAR および NVARCHAR2 データ型

NCHARおよびNVARCHAR2Unicode 文字データを格納する Unicode データ型です。これらは、ネイティブ データ型とも呼ばれます。

データ型には、NVARCHAR2可変長文字列が格納されます。

列を含むテーブルを作成する場合、NVARCHAR2指定される最大サイズは常に文字長セマンティクスになります。文字長のセマンティクスは、 のデフォルトで唯一の長さのセマンティクスですNVARCHAR2

たとえば、各国語キャラクタ・セットがUTF8の場合、次の文は最大バイト長90バイトを定義します:

CREATE TABLE tab1 (col1 NCHAR(30));

列の最大長NVARCHAR2は 4000 バイトです。最大 4000 文字まで保持できます。実際のデータの最大バイト数は 4000 です。2 つのサイズの制約は、実行時に同時に満たす必要があります。

それはすべて、文字セットと長さのセマンティクスに依存します。

あなたの問題の理由は

覚えておくべきもう 1 つの重要な点は、VARCHAR2 に格納されるバイト数の上限が 4,000 であることです。ただし、VARCHAR2(4000 CHAR) を指定しても、そのフィールドに 4,000 文字が収まらない場合があります。実際、選択した文字セットですべての文字を表すのに 4 バイトかかる場合、そのフィールドにはわずか 1,000 文字しか収まらない可能性があります。

これは、Native データ型にも当てはまります。

解決:

VARCHAR2 または CHAR の長さセマンティクスとしてCHAR代わりに使用します。BYTES

その理由は、シングルバイト文字セットの 20 文字の文字列は 20 バイトの長さであり、VARCHAR2(20) に完全に収まるためです。ただし、20 文字のフィールドは、マルチバイト文字セットでは 80 バイトの長さになる可能性があり、20 の Unicode 文字は 20 バイトに収まらない可能性があります。

于 2013-10-23T10:29:30.543 に答える