我正在尝试将£
与其他特殊字符排序,但不能正确排序。
我希望该字符串与其他以特殊字符开头的字符串一起排序。例如,我有四个字符串:
&!@#
££$$
abcd
&#$%
。 现在按顺序排序:&!@#, &#$%, abcd, ££$$
。
我希望它按顺序排列:&!@#, &#$%, ££$$, abcd
。
我已使用replace(column,'£','*')
的函数顺序,因此它会与以*
开头的字符串一起排序。虽然这在查询数据库时似乎有效,但在代码中使用并部署时,£
会被�
替换,即查询中的(replace(column,'�','*')
,并且不会按预期排序。< / p>
如何解决此问题?有没有其他解决方案来排序英镑符号/£?任何帮助将不胜感激。
答案 0 :(得分:4)
你似乎有两个问题;执行实际排序,以及(可能)£符号在代码中的结果中的显示方式。在不了解您的代码或客户端或环境的情况下,很难猜出您可能需要更改的内容,但我首先要在客户端查看您的NLS_LANG和其他NLS设置。 @ amccausl的链接可能很有用,但这取决于你正在做什么。我怀疑当你从SQL * Plus和你的代码中查询时,你会在nls_session_parameters
中找到不同的值,这可能会给你一些指示。
排序本身现在略显清晰。请查看Linguistic Sorting and String Searching和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
更改它,但它只允许我使用某些值来执行此操作,因此在此处可能没有帮助。)
答案 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)