在oracle sql中使用firstname(varchar2数据类型)排序问题

时间:2018-05-15 06:28:29

标签: sql oracle

我有一个用户表,其中我的列名为varchar2的列名。当我执行带有order by子句的简单select语句时,如下所示:

select * from Loginuser order by firstname

我以正确的订单格式获得结果。姓名从A开始,并继续按顺序排列,但最后3条记录与此条件不符。

如果我查看姓氏如下的最后6条记录:

Ying
Yogen
Yvet
alo
pal
Ângelo

所以我不知道最后三条记录有什么问题?

2 个答案:

答案 0 :(得分:4)

Tim Biegeleisen解决了如何解决问题的方法。但要回答你问的问题:

  

最后三条记录出了什么问题?

ORDER BY / CHAR列上的

VARCHAR2将按连续字符的字符代码排序。

SQL Fiddle

查询1

SELECT firstname,
       ASCII( firstname ),
       DUMP( firstname )
FROM   loginuser

<强> Results

| FIRSTNAME | ASCII(FIRSTNAME) |                          DUMP(FIRSTNAME) |
|-----------|------------------|------------------------------------------|
|      Ying |               89 | Typ=1 Len=4: 89,105,110,103              |
|     Yogen |               89 | Typ=1 Len=5: 89,111,103,101,110          |
|      Yvet |               89 | Typ=1 Len=4: 89,118,101,116              |
|       alo |               97 | Typ=1 Len=3: 97,108,111                  |
|       pal |              112 | Typ=1 Len=3: 112,97,108                  |
|    Ângelo |            50050 | Typ=1 Len=7: 195,130,110,103,101,108,111 |

ASCII列中,您可以看到Y的字符代码为89,a97p为112且{{ 1}}是一个2字节的unicode字符50050(或字节195和130),它们按字符代码的升序排序。

另一种解决方案是使用ÂCONVERTUPPER

查询2

LOWER

<强> Results

SELECT firstname,
       UPPER( CONVERT( firstname, 'US7ASCII' ) )
FROM   loginuser
ORDER BY UPPER( CONVERT( firstname, 'US7ASCII' ) )

答案 1 :(得分:2)

您可以尝试使用ORDER BY以及二进制排序规则:

SELECT *
FROM Loginuser
ORDER BY NLSSORT(firstname, 'NLS_SORT=BINARY_AI')

来自Oracle documentation

  

BINARY_AI表示不区分重音且不区分大小写的二进制排序。