Лингвистическая сортировка и поиск строк извлекает неверные данные в 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';