Oralceでの漢字の長さの問題


一般に,Java層で文字列長を検証する際にStringを用いる.length()メソッドは,中国語でも英語でも返す長さは同じである.
ただし、データベースを挿入すると、エラー(長さが境界を越えている)が発生することがあります.
public class StringLength {
	
	public static void main(String[] args) {
		System.out.println("  ".length());
		System.out.println("cs".length());
	}

}

コンソールには次の結果が表示されます.
2
2

しかし、データベースでは、データベースの文字セットによって、漢字が占める「桁数」も異なります.
データベース文字セット
占有ビット数
WE8ISO8859P1
1
AL32UTF8
3
ZHS16GBK
2
したがって、フィールドusernameを最大3に設定すると、データベースでこのように定義する必要があります.
WE8ISO8859P1        varchar(3)
AL32UTF8                 varchar(9)
ZHS16GBK                varchar(6)
これは、テーブルを定義する際にアプリケーションの状況を考慮することを要求します.
では、現在のデータベースの文字セットをどのように表示しますか?
select * from nls_database_parameters;

もちろん、varcharタイプで定義された長さがバイト長であるため、データベース内の文字長とバイト長の問題を表示する必要があります.
varchar(3)     varchar(3 byte)

次のようになります.
select length('  ') from dual;  --2
select lengthb('  ') from dual; --4
select length('cs') from dual;    --2
select lengthb('cs') from dual;   --2