Подчеркивание Oracle: порядок результатов запроса JDBC в Linux отличается от результата в MAC-OS или Windows

У меня есть ТАБЛИЦА с двумя столбцами:

ID ОПИСАНИЕ
1 первая строка
2 вторая строка
3 _
4 1 первая числовая строка

и у меня есть запрос

SELECT * FROM TABLE ORDER BY DESCRIPTION

Проблема в том, что я получаю разные результаты в зависимости от машины, на которой я запускаю код. Если я запустил код на

  • linux (centos) Я получаю следующий результат
    ID DESCRIPTION
    4 1 первая числовая строка
    3 _
    1 первая строка
    2-я строка

  • windows (7) Я получаю следующий результат
    ID ОПИСАНИЕ
    3 _
    1 первая строка
    2 вторая строка < br /> 4 1 первая числовая строка

  • MAC OS (Snow Leopard) получаю следующий результат
    ID DESCRIPTION
    3 _
    1 первая строка
    2 секунды строка
    4 1 первая числовая строка

Итак, как вы можете видеть, символ подчеркивания «_» обрабатывается по-разному в зависимости от машины, на которой я выполняю запрос :(.
Это проблема драйвера? Почему я не получаю тот же результат?


person duderoot    schedule 02.08.2012    source источник
comment
Возможно, проблема со средой на стороне клиента устанавливает другой NLS_LANG или NLS_SORT в сеансе? Было бы неплохо, если бы вы могли запустить запрос из sqlplus в обеих средах, посмотреть, будет ли результат одинаковым, и если да, то попробуйте еще раз с тем же изменением сеанса, установленным nls_lang ... в обеих средах перед запросом.   -  person Glenn    schedule 03.08.2012
comment
Я предполагаю, что база данных централизована, и все клиенты вызывают одну и ту же базу данных?   -  person MadProgrammer    schedule 03.08.2012
comment
Дополнительную информацию о комментарии Гленна см. В документации . Ваш языковой стандарт Java влияет на этот параметр; см., например, вопрос.   -  person Alex Poole    schedule 03.08.2012


Ответы (2)


10x за подсказки. На самом деле проблема заключалась в настройке локали, у меня было:

  • на Linux

    LANG=en_US.UTF-8

    LC_CTYPE="en_US.UTF-8"

  • на Mac

    LANG=de_DE.UTF-8

    LC_CTYPE="de_DE.UTF-8"

После установки locale на Linux-машине на немецком utf-8 у меня был тот же результат на Linux, что и на другом компьютере (Mac и Windows), и теперь сборка вернулась к стабильной :).

Я попытаюсь поиграть с конфигурацией NLS_LANG, чтобы иметь возможность установить locale Linux-машины обратно на английский utf-8.

person duderoot    schedule 03.08.2012

Порядок зависит от ваших настроек NLS. См. настройки NLS_LANG и NLS_SORT. Если вы предоставите одинаковые настройки NLS для всех сред, порядок будет одинаковым.

Вы также можете указать порядок явно:

SELECT * 
  FROM TABLE 
 ORDER BY NLSSORT(Description, 'NLS_SORT = BINARY')

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

person Grzegorz Kazior    schedule 22.09.2016