我有一个用户表,其中我有数据类型为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,a
是97
,p
是 112,Â
是 2 字节 unicode 字符 50050(或字节 195 和 130(,它们按字符代码的升序数字顺序排序。
另一种解决方案是使用CONVERT
和UPPER
或LOWER
:
查询 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指定不区分重音和不区分大小写的二进制排序。