2017-07-12 8 views
0

サイズ= 8のページの入力フィールドがあります。DBの列の制限を超えないように入力のサイズを確認する方法

DBでは、対応する列はVARCHAR2(8)です。

しかし、フィールドに特殊なascii文字で長さ8の文字列を入力すると、次の例外が発生します。

ORA-12899:列xxxxのためにあまりにも大きな値(:10、最大:実際8)

私はバリデータでこれをキャッチしようとしているが、私は(myString.getBytesを確認してください)もの長さ。 8.

DB側では、列をVARCHAR2(8 CHAR)に変更するという解決策があります。

コントローラーでこれを確認できる別の解決策がありますか?

+1

「特殊なASCII文字は」意味がない - あなたはマルチバイト/ Unicode文字、または少なくとも非ASCII文字を意味し、右? ASCII文字は常に1バイトです。 –

+0

はい。私はマルチバイト/ユニコード文字を意味します。 実際には、漢字を入力します。 –

+0

文字のバイト長は(少なくとも時々)文字セットに依存すると私は考えます。したがって、DBから少なくとも**何か**を知らなくてもこのチェックをすることはできません。つまり、DBキャラクタセットです。 'myString.getBytes()。length'が返すと思われるものが何であるかわかりません - 文字セットを引数として取ることなく、どのように知ることができますか?デフォルトの文字セット(おそらくOSの文字セット?) – mathguy

答えて

1

これはあなたに役立ちます、これは実際のサイズをバイトで返します。

SELECT LENGTHB ('é') 
    FROM DUAL; 

上記は2を返しますので、使用しているものは何でも文字、あなたが10バイトを与えてくれたが、列が唯一の私は8を可能にすることを言っているMY_VARCHAR_FIELD VARCHAR2(2 BYTES)

+0

OPはこれをキャッチしようとしていませんか*前にデータベースに行くのですか? –

+0

DBを呼び出さずにこれを行う方法はありますか? –

+0

@DavidRuanはい、私の答えを見てください。 – jeff6times7

2

エラーのようなものを指定することができますあなたの中国語文字セットの使用のためにそれがバイトであると仮定します。だから、私は列がVARCHAR2(8バイト)のように作成されたと信じています。

テーブルを記述すると、何が起こっているのかがわかります。この説明とその説明を比較してください。

create table x (a varchar2(30), b varchar2(30 byte), c varchar2(30 char)); 

バイト数を取得するために実行しているコードはほぼ正しいです。代わりに:

myString.getBytes().length /* this probably returns 8 */ 

あなたはこれを実行する必要があります:

myString.getBytes("UTF-8").length /* this probably returns 10 */ 
+0

ありがとう、それは動作します。 –

関連する問題