Лингвистическая сортировка и поиск строк извлекает неверные данные в Oracle

У меня есть таблица "Аудит" в базе данных Oracle 11g. В таблице есть столбец "Account_Name". Столбец "Аудит"."Имя_счета" содержит следующие данные: "Гость", "feeder_1", "feeder_2", "feeder_3" и т. Д.

Я создал следующий индекс в столбце "Audit.Account_Name".

CREATE INDEX AUDIT_IX9_CI ON AUDIT (NLSSORT("ACCOUNT_NAME",'nls_sort=''BINARY_CI'''));

Из кода JDBC я сначала выполняю приведенные ниже операторы, а затем выполняю фактический запрос для извлечения данных из таблицы "Аудит".

connection.prepareStatement("ALTER SESSION SET NLS_COMP=LINGUISTIC"); //line1

connection.prepareStatement("ALTER SESSION SET NLS_SORT=BINARY_CI");  // line2

// Это код, который выполняется для извлечения данных

connection.prepareStatement("select account_name from audit where  (ACCOUNT_NAME  like  'f%' ) ");//line3

rs = pst.executeQuery();//line4

while(rs.next()){
     String accountName = rs.getString("account_name");
     System.out.println("account name "+accountName);
}

Приведенный выше запрос извлекает все данные из таблицы, включая значения типа "Гость". Я исключаю, что запрос должен извлекать только те строки, где Account_name начинается с 'f', но выглядит как NLS_SORT, а NLS_COMP выбирает неверные данные.

Я обнаружил, что, если я прокомментирую "line2", он правильно выбирает данные. Может кто-нибудь подсказать, почему эти опции не работают должным образом.

Я выполнил запрос из кода JDBC для того же объекта подключения.

select PARAMETER, value from nls_session_parameters

NLS_LANGUAGE = AMERICAN
NLS_TERRITORY = AMERICA
NLS_CURRENCY = $
NLS_ISO_CURRENCY = AMERICA
NLS_NUMERIC_CHARACTERS = .,
NLS_CALENDAR = GREGORIAN
NLS_DATE_FORMAT = DD-MON-RR
NLS_DATE_LANGUAGE = AMERICAN
NLS_SORT = BINARY_CI
NLS_TIME_FORMAT = HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT = DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT = HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT = DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY = $
NLS_COMP = LINGUISTIC
NLS_LENGTH_SEMANTICS = BYTEs
NLS_NCHAR_CONV_EXCP = FALSE 

Эта проблема возникает в производственной среде. Итак, ранее я написал автономный код Java с использованием JDBC, чтобы проверить, получаю ли я ту же проблему, что и в производственной среде.

Теперь я написал процедуру Oracle, в которой сначала устанавливаются параметры NLS_COMP и NLS_SORT, а затем выполняется поисковый запрос (здесь использовался CURSOR), а затем сбрасывается NLS_SORT=BINARY. Результаты такие же, я получаю ту же проблему.

объяснить план
  выберите account_name из аудита, где account_name вроде 'f%'


Хэш-значение плана: 1078245361

----------------------------------------------------------------------------------
| Id  | Операция | Имя | Ряды | Байт | Стоимость (% ЦП)| Время |
----------------------------------------------------------------------------------
|   0 | ВЫБРАТЬ ЗАЯВЛЕНИЕ |               |    10 |  2580 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| AUDIT_IX9     |    10 |  2580 |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Информация предиката (идентифицируется по идентификатору операции):
---------------------------------------------------

   1 - доступ ("ACCOUNT_NAME", LIKE U'f%')
       фильтр ("ACCOUNT_NAME", LIKE U'f%')

Заметка
-----
   - динамическая выборка, используемая для этого оператора (уровень =2)

После выполнения следующего запроса я получил набор символов как "WE8MSWIN1252";

выберите значение в char_set из nls_database_parameters, где параметр = 'NLS_CHARACTERSET';

0 ответов

Другие вопросы по тегам