Nieoczekiwana kolejność rekordów

Kolejna sprawa związana porządkowaniem rekordów. Tym razem "kwiatek w Oracle", które dość nieoczekiwanie implementuje ORDER BY.

Przy polskich ustawieniach językowych Oracle co najmniej dziwnie sortuje teksty zawierające niektóre znaki matematyczne i interpunkcyjne. Opisane niżej zachowanie testowałem na Oracle 8.0.3 i 8.0.5 na VMS i dwóch różnych systemach Unix.

Zacznę od przykładu. Ustawmy zmienną środowiskową NLS_LANG na polish_poland.EE8ISO8859P2 i wykonajmy następujące operacje:

CREATE TABLE some_table (text VARCHAR(10));

INSERT INTO some_table VALUES ('AB');
INSERT INTO some_table VALUES ('A+B');
INSERT INTO some_table VALUES ('AB');

SELECT * FROM some_table ORDER BY text;

DROP TABLE some_table;

Efekt wykonania powyższego polecenia SELECT:

TEXT
----------
AB
A+B
AB

Przypominam, że sortowaliśmy po polu text.

Przy braku zmiennej NLS_LANG (domyślny, amerykański tryb działania), wszystko działa jak trzeba. Innych ustawień nie testowałem acz sądzę, że inne języki mogą mieć podobny błąd.

Problem może być mniej lub bardziej dotkliwy, na pewno warto o nim wiedzieć. U mnie spowodował błędne działanie programu, który czytał rekordy sortowane po polu nie będącym kluczem i wykonywał pewne czynności przy każdej zmianie wartości tego pola. Prosty zbliżony przykład, jaki sobie wyobrażam, to program, który generowałby raport prezentując jedno z pól nie jako wartość ale jako specjalny wtrącany nagłówek.

Support Oracle stwierdził, że wszystko jest w porządku (w matrycy sortowania polskich znaków znaki specjalnie nie mają swojej wagi), a jeśli mi się to nie podoba, mogę ustawić NLS_SORT na binary (co powoduje zniknięcie naturalnego sortowania polskich znaków - ą nie będzie już pomiędzy a i b).

komentarze obsługiwane przez Disqus