5

Javaから大文字と小文字を区別せずにSQLデータベースをクエリする一般的な方法は次のとおりです。

String name = ...;  // get the user's input (case is unknown)
String sql = "select * from Person where lower(name) = ?";
Object jdbcBindVariable = name.toLowerCase();
// ... using JDBC, bind that variable and run the SQL query

問題は、小文字がロケール固有の操作であるということです。たとえば、文字 " I"を小文字にすると、英語とトルコ語で異なる結果が得られます。上記のコードには、2つの小文字の操作があります。

  • String#toLowerCase()メソッド
  • lower()データベース関数

Javaとデータベースが同じロケールを使用していることを確認して、有効な比較を実行するにはどうすればよいですか?

StringクラスにtoLowerCase(Locale)メソッドがあることは知っていますが、データベースが使用しているロケールを知るにはどうすればよいですか?これをプログラムで確認できますか、それともデータベース(この場合はOracle 10g)が構成されていると思われるロケールにロケールをハードコーディングする必要がありますか?

4

2 に答える 2

2

簡単な答えは、データベースにそれを行わせることです。そうすれば、バインド変数を小文字にする方法は、列の値を小文字にする方法と一致します。

String sql = "select * from Person where lower(name) = lower(?)";
于 2010-02-02T05:12:19.013 に答える
1

...しかし、データベースが使用しているロケールをどのように知ることができますか?これをプログラムで確認できますか...

これを行うための移植可能な(データベースに依存しない)方法はないようですが、次のクエリを使用して、Orableデータベースで使用される文字セットを取得できるようです。

select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

このページで詳細を説明します。

実際に比較を行う場合は、@ Garyが示唆しているように、データベースに小文字を処理させるのが最善です(*)。JDBCドライバーは、Java(UTF-16)文字列をデータベースが使用しているものに変換します。

(*実際、すべてのクエリ可能な文字列の大文字と小文字の混合コピーと小文字のコピーをデータベースに格納するコストを負担する準備ができていない限り、選択肢はあまりないと思います。)

于 2010-02-02T05:18:56.450 に答える