Sql Oracle排序顺序和大于运算符在varchar列上不一致

Sql Oracle排序顺序和大于运算符在varchar列上不一致,sql,oracle,sql-order-by,Sql,Oracle,Sql Order By,我有一张简单的桌子 CREATE TABLE TRIAL ( "COL" VARCHAR2(20 BYTE) ) 我在这里插入两个值,“0”和“A” 询问 select * from trial order by col 返回 A 0 按此顺序,而查询 select * from trial where col>'A' 不返回任何结果。 这种行为的原因可能是什么?在不改变数据库配置的情况下,是否有一些简单的技巧,可以通过和以一致的方式获得订单 编辑: 回答评论

我有一张简单的桌子

 CREATE TABLE TRIAL 
   (    "COL" VARCHAR2(20 BYTE)
   )
我在这里插入两个值,“0”和“A”

询问

select * from trial order by col
返回

A
0
按此顺序,而查询

select * from trial where col>'A'
不返回任何结果。 这种行为的原因可能是什么?在不改变数据库配置的情况下,是否有一些简单的技巧,可以通过和以一致的方式获得订单

编辑:

回答评论:

select * from v$parameter where name like 'nls_sort'
返回

Typ=1 Len=1: 30 0
Typ=1 Len=1: 41 A

返回

Typ=1 Len=1: 30 0
Typ=1 Len=1: 41 A

它应该按字符串的二进制/ASCII值排序

翻译价值观

  • 0
    =>
    48
  • A
    =>
    65
当您按
col
排序时,默认值为升序,因此我希望
0
首先出现,然后是
A

当您要求>'A'时,您要求的是>65,并且'A'或'0'都不大于65,因此这是有意义的

如评论中所述,我将检查您的sort
NLS\u sort
值,以查看排序是否有异常:

您还可以确保这与您的
NLS\u COMP
值匹配:

您可以在此答案中找到更多信息:


注意:实际问题是
NLS\u SORT
参数。请看一看,以便更好地掌握和理解特定参数值

实际发行

SQL> SELECT * FROM trial ORDER BY col;

COL
--------------------
A
0
问题实际上是由于
NLS\u SORT
参数值从
'BINARY'
修改为
'WEST\u EUROPEAN'

设置

SQL> CREATE TABLE TRIAL
  2     (    "COL" VARCHAR2(20 BYTE)
  3     );

Table created.

SQL> INSERT INTO trial(col) VALUES('0');

1 row created.

SQL> INSERT INTO trial(col) VALUES('A');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM trial ORDER BY col;

COL
--------------------
0
A
NLS参数值

SQL> SHOW PARAMETER NLS_SORT;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
nls_sort                             string      BINARY

SQL> SHOW PARAMETER NLS_COMP;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
nls_comp                             string      BINARY
让我们更改
NLS\u SORT
参数值:

SQL> ALTER SESSION SET NLS_SORT='WEST_EUROPEAN';

Session altered.
错误再现

SQL> SELECT * FROM trial ORDER BY col;

COL
--------------------
A
0

因此,现在值的排序随着
NLS\u SORT
参数值的变化而变化。

我尝试了查询,并从试用顺序中选择*按col for me返回0,A。你确定你没有遗漏什么吗?尝试选择dump(col,16),col from trial查看每个字符的ASCII码。检查nls_排序参数<代码>从v$参数中选择*,其中的名称类似于“nls_排序”;无法使用提供的样本值复制第一个结果集。我可以复制你的第二个问题,正如Andrew的答案所演示的那样,这是正确的。@StefanYordanov我刚刚编辑了我的问题来回答你的问题,那么NLS_排序和NLS_COMP设置为什么,你是在查询NLS_会话参数吗?例如,我可以复制您在binary/edbdic中看到的内容,但是查看您实际使用的内容会很有趣。(阅读更多关于这些原因的信息)我不认为你用col顺序复制了OP的结果。但这并不能解释我所看到的排序行为,是吗?@shawnt00我认为OP没有说明完整的细节。@LaitKumar我怀疑我所看到的与排序是“语言”而不是“二进制”这一事实有关在我的配置中。然而,您的回答向我建议了一种可能的解决方法:通过ascii(col)从试订单中选择*。这与>。谢谢你,我对你的答案投了赞成票。@AlexPoole我刚想出来。这么多的编辑,这么多的评论,我只是感到困惑。我已经更新了答案,并删除了以前的评论。咖啡今天没用:-)