Как отсортировать результаты без учета регистра в Oracle SQL? - PullRequest
5 голосов
/ 02 февраля 2010

Классический способ запроса к базе данных SQL без учета регистра из Java заключается в следующем:

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" дает разные результаты на английском и турецком языках. В приведенном выше коде есть две операции в нижнем регистре:

  • Метод String # toLowerCase ()
  • Нижняя () функция базы данных

Как я могу убедиться, что Java и база данных используют одну и ту же локаль и, таким образом, выполняют правильное сравнение?

Мне известно, что класс String имеет метод toLowerCase (Locale), но как мне узнать, какой Locale использует база данных? Могу ли я проверить это программно или мне нужно жестко прописать локаль к той, с которой я думаю, что база данных (в данном случае Oracle 10g) настроена?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Простой ответ - пусть база данных сделает это.Таким образом, способ, которым переменная связывания помещается в нижний регистр, будет соответствовать способу, которым значение столбца помещается в строчные буквы.

1 голос
/ 02 февраля 2010

... но как мне узнать, какую локаль использует база данных? Можно ли проверить это программно ...

Кажется, что нет портативного (независимого от базы данных) способа сделать это, но вы, очевидно, можете использовать следующий запрос, чтобы получить кодировку, используемую базой данных Orable:

select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

Эта страница дает более подробную информацию.

Что касается фактического сравнения, вам лучше всего (*) позволить базе данных позаботиться о нижнем регистре, как предлагает @Gary. Драйвер JDBC позаботится о преобразовании строк Java (UTF-16) во все, что использует база данных.

(* На самом деле, я не думаю, что у вас есть большой выбор, если только вы не готовы нести расходы на хранение смешанных и строчных букв всех запрашиваемых строк в базе данных.)

...