Oralceでの漢字の長さの問題
一般に,Java層で文字列長を検証する際にStringを用いる.length()メソッドは,中国語でも英語でも返す長さは同じである.
ただし、データベースを挿入すると、エラー(長さが境界を越えている)が発生することがあります.
コンソールには次の結果が表示されます.
しかし、データベースでは、データベースの文字セットによって、漢字が占める「桁数」も異なります.
データベース文字セット
占有ビット数
WE8ISO8859P1
1
AL32UTF8
3
ZHS16GBK
2
したがって、フィールドusernameを最大3に設定すると、データベースでこのように定義する必要があります.
では、現在のデータベースの文字セットをどのように表示しますか?
もちろん、varcharタイプで定義された長さがバイト長であるため、データベース内の文字長とバイト長の問題を表示する必要があります.
次のようになります.
ただし、データベースを挿入すると、エラー(長さが境界を越えている)が発生することがあります.
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