Oracle SQL 中 FirstName(varchar2 数据类型)的排序问题



我有一个用户表,其中我有数据类型为varchar2的列名号。 当我使用如下所示的顺序 by 子句执行简单的选择语句时:

select * from Loginuser order by firstname

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

如果我查看最后 6 条名字如下的记录:

Ying
Yogen
Yvet
alo
pal
Ângelo

所以我不知道最后三张唱片有什么问题?

Tim Biegeleisen给出了如何解决问题的解决方案。但是要回答你提出的问题:

最后三条记录有什么问题?

CHAR/VARCHAR2列上的ORDER BY将按连续字符的字符代码排序。

SQL 小提琴

查询 1

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

结果

| 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,Â是 2 字节 unicode 字符 50050(或字节 195 和 130(,它们按字符代码的升序数字顺序排序。

另一种解决方案是使用CONVERTUPPERLOWER

查询 2

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

结果

| FIRSTNAME | UPPER(CONVERT(FIRSTNAME,'US7ASCII')) |
|-----------|--------------------------------------|
|       alo |                                  ALO |
|    Ângelo |                               ANGELO |
|       pal |                                  PAL |
|      Ying |                                 YING |
|     Yogen |                                YOGEN |
|      Yvet |                                 YVET |

您可以尝试将ORDER BY与二进制排序规则一起使用:

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

从 Oracle 文档中:

BINARY_AI指定不区分重音和不区分大小写的二进制排序。

最新更新