Сортировка '£' (символ фунта) в sql - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь отсортировать £ вместе с другими специальными символами, но сортировка выполняется неправильно.

Я хочу, чтобы эта строка сортировалась вместе с другими строками, начинающимися со специальных символов. Например, у меня есть четыре строки:

  1. &!@#
  2. ££$$
  3. abcd
  4. &#$%.

Теперь сортировка по порядку: &!@#, &#$%, abcd, ££$$.
Я хочу это в порядке: &!@#, &#$%, ££$$, abcd.

Я использовал порядок функций по replace(column,'£','*'), чтобы он сортировался вместе со строками, начинающимися с *. Хотя это похоже на работу при запросе БД, при использовании в коде и развертывании £ заменяется на �, то есть (replace(column,'�','*') в запросе, и не сортируется должным образом.

Как решить эту проблему? Есть ли другое решение для сортировки символа фунта / £? Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

4 голосов
/ 05 января 2012

У вас, кажется, две проблемы; выполнение фактической сортировки и (возможно), как символ £ появляется в результатах в вашем коде. Не зная ничего о вашем коде, клиенте или среде, довольно сложно угадать, что вам может понадобиться изменить, но я бы начал с просмотра вашего NLS_LANG и других настроек NLS на стороне клиента. Ссылка @ amccausl может быть полезной, но это зависит от того, что вы делаете. Я подозреваю, что вы найдете другие значения в nls_session_parameters при запросе из SQL * Plus и из вашего кода, что может дать вам несколько указателей.

Сама сортировка теперь немного понятнее. Посмотрите документы для лингвистической сортировки и поиска строк и NLSSORT.

Вы можете сделать что-то вроде этого (с помощью CTE для генерации ваших данных):

with tmp_tab as (
    select '&!@#' as value from dual
    union all select '££$$' from dual
    union all select 'abcd' from dual
    union all select '&#$%' from dual
)
select * from tmp_tab
order by nlssort(value, 'NLS_SORT = WEST_EUROPEAN')

VALUE
------
&!@#
&#$%
££$$
abcd

4 rows selected.

Вы можете получить значения сортировки, поддерживаемые вашей конфигурацией, с помощью select value from v$nls_valid_values where parameter = 'SORT', но WESTERN_EUROPEAN, похоже, в любом случае делает то, что вы хотите, для этого примера данных.

Вы можете увидеть сортировку по умолчанию в вашем текущем сеансе с select value from nls_session_parameters where parameter = 'NLS_SORT'. (Вы можете изменить это с помощью ALTER SESSION, но это позволяет мне делать это только с некоторыми значениями, поэтому здесь это может оказаться бесполезным).

0 голосов
/ 05 января 2012

Похоже, что ваша проблема связана с набором символов БД или разницей в наборах символов между приложением и БД.Что касается Oracle, вы можете проверить это, выполнив:

select value from sys.nls_database_parameters where parameter='NLS_CHARACTERSET';

Если это произойдет ascii (например, US7ASCII), то у вас могут возникнуть проблемы с правильным хранением данных.Даже если это кодировка, вы сможете вставлять и получать отсортированные (двоичные сортировки), используя nvarchar2 и unistr (при условии, что они соответствуют вашему NLS_NCHAR_CHARACTERSET, см. Запрос выше, но измените параметр), например:

create table test1(val nvarchar2(100));
insert into test1(val) values (unistr('\00a3')); -- pound currency
insert into test1(val) values (unistr('\00a5')); -- yen currency
insert into test1(val) values ('$'); -- dollar currency
commit;

select * from test1
order by val asc;

- будет давать символы по порядку: доллар ('\ 0024'), фунт ('\ 00a3'), иена ('\ 00a5')

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

Если у вас нет проблем с сохранением / получением данныхсторона, тогда ваш набор символов приложения / клиента, вероятно, отличается от вашего db.

0 голосов
/ 05 января 2012

Вы должны убедиться, что код вашего приложения соответствует UTF-8 (см. http://htmlpurifier.org/docs/enduser-utf8.html для более подробной информации)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...