gpt4 book ai didi

sql - oracle sql中名字(varchar2数据类型)的排序问题

转载 作者:行者123 更新时间:2023-12-01 15:25:50 29 4
gpt4 key购买 nike

我有一个用户表,其中列 firstname 的数据类型为 varchar2。当我执行带有如下 order by 子句的简单 select 语句时:

select * from Loginuser order by firstname

我得到的结果格式正确。名称从 A 开始并继续按照 order by 但最后 3 条记录不符合此条件。

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

Ying
Yogen
Yvet
alo
pal
Ângelo

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

最佳答案

Tim Biegeleisen 给出了解决问题的方法。但要回答您提出的问题:

what is wrong with last three records?

CHAR/ VARCHAR2 列上的

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

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

另一种解决方案是使用CONVERTUPPERLOWER:

查询 2:

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

Results :

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

关于sql - oracle sql中名字(varchar2数据类型)的排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50343614/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com