2

私は奇妙な問題に直面しています。私はこのようなコードを持っています。

insert into my_table
    substr(my_name,1,199)

与えられたエラーは次のとおりです。

列に対して値が大きすぎます...(実際:246、最大:200)

私のテーブルで最大の名前を見ると、次のようなものがあります: "8" x12&#34 "

一部の文字セットが実行されている可能性があるため、挿入すると文字数が増加しますか?もしそうなら、どうすればそれを修正できますか?サブストリング化する前に明示的にUTF8に変換しようとしましたが、それはまったく役に立ちません。

4

3 に答える 3

3

私は試してみることをお勧めします:

insert into my_table(col)
    select cast(substr(my_name,1,199) as varchar(200))

(私は常に明示的な列名を挿入に含めます。)

varcharに明示的に変換すると、文字列が長すぎるとエンジンが考える問題が解決する場合があります。

于 2012-12-13T02:44:22.683 に答える
2

上記の両方のコメントによると、あなたは基本をチェックしたいと思います。また、substrb、substr on selectの両方を実行でき、違いを監視することも役立つ可能性があります。

ここに素晴らしい記事があります

「これまで、英数字データを保持するデータベース列は、格納するバイト数を使用して定義されてきました。このアプローチは、バイト数がシングルバイト文字セットを使用する場合の文字数に等しいため、問題ありませんでした。マルチバイトの使用が増えるにつれてグローバル化されたデータベースをサポートする文字セットには、バイトが文字と等しくなくなるという問題が発生します。VARCHAR2およびCHARタイプは、長さを指定する2つの方法をサポートします。バイト単位:VARCHAR2(10バイト)。これにより、最大10バイトのデータがサポートされます。マルチバイト文字セットでは2文字までにしてください。文字数:VARCHAR2(10文字)。これにより、最大10文字のデータがサポートされます。これは、最大40バイトの情報になる可能性があります。」

助言

UTF8などのマルチバイト文字セットを使用する場合、実際にデータの文字を格納できる列を定義することを意図している可能性が高いため、次を使用できます。

  • VARCHAR2/CHAR定義のCHAR修飾子。つまり、VARCHAR2(80)ではなくVARCHAR2(80 CHAR)を使用します。

  • セッションまたはシステムパラメータNLS_LENGTH_SEMANTICSを使用して、デフォルトの動作をBYTEからCHARに変更します。

この設定をシステムレベルのスコープではなく、SESSIONスコープで変更することをお勧めします。

それは言う、

人々が頻繁に遭遇する2つの問題は、次のとおりです。

  • マルチバイト文字セットを使用する場合、つまりVARCHAR2(N)は必ずしもN文字を保持する必要はなく、Nバイトを保持する必要があります。

  • VARCHAR2のバイト単位の最大長は4,000であり、CHARでは2,000です。

于 2012-12-13T02:46:39.817 に答える
0

substrbを使用することもできます。

 insert into my_table
     substrb(my_name,1,199)

これにより、文字列は文字ではなく最初の199バイトに制限されます。

于 2017-09-14T13:57:20.717 に答える