在sql中排序'£'(英镑符号)

时间:2012-01-05 05:03:24

标签: sql oracle sorting utf-8 oracle11g

我正在尝试将£与其他特殊字符排序,但不能正确排序。

我希望该字符串与其他以特殊字符开头的字符串一起排序。例如,我有四个字符串:

  1. &!@#
  2. ££$$
  3. abcd
  4. &#$%
  5. 现在按顺序排序:&!@#, &#$%, abcd, ££$$
    我希望它按顺序排列:&!@#, &#$%, ££$$, abcd

    我已使用replace(column,'£','*')的函数顺序,因此它会与以*开头的字符串一起排序。虽然这在查询数据库时似乎有效,但在代码中使用并部署时,£会被�替换,即查询中的(replace(column,'�','*'),并且不会按预期排序。< / p>

    如何解决此问题?有没有其他解决方案来排序英镑符号/£?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

你似乎有两个问题;执行实际排序,以及(可能)£符号在代码中的结果中的显示方式。在不了解您的代码或客户端或环境的情况下,很难猜出您可能需要更改的内容,但我首先要在客户端查看您的NLS_LANG和其他NLS设置。 @ amccausl的链接可能很有用,但这取决于你正在做什么。我怀疑当你从SQL * Plus和你的代码中查询时,你会在nls_session_parameters中找到不同的值,这可能会给你一些指示。

排序本身现在略显清晰。请查看Linguistic Sorting and String SearchingNLSSORT的文档。

您可以执行以下操作(使用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更改它,但它只允许我使用某些值来执行此操作,因此在此处可能没有帮助。)

答案 1 :(得分:0)

您需要确保您的应用程序代码都是正确的UTF-8(有关详细信息,请参阅http://htmlpurifier.org/docs/enduser-utf8.html

答案 2 :(得分:0)

好像你的问题是db characteret,或者app和db之间的字符集有所不同。对于Oracle方面,您可以通过执行以下操作进行检查:

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

如果出现ascii(如US7ASCII),则可能存在正确存储数据的问题。即使这是charset,您也应该能够使用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')

我会说我不会使用国家字符集,我可能会更改数据库字符集以满足我的数据需求,因为支持2个差异字符集并不理想,但无论如何它都可用

如果您在数据方面存储/检索没有问题,那么您的app / client characterset可能与您的数据库不同。

答案 3 :(得分:0)

使用 nchar(168)。它会起作用。

<块引用>

选择 nchar(168)