SQL> select min(pid),max(pid),count(1),count(distinct pid) from TB_WOPAY_RSA;
MIN(PID) MAX(PID) COUNT(1) COUNT(DISTINCTPID)
---------- ---------- ---------- ------------------
0 999999 5000000 5000000
SQL> desc TB_WOPAY_RSA
Name Type Nullable Default Comments
---------- -------------- -------- ------- -----------
PID VARCHAR2(10)
PUBLICKEY VARCHAR2(1024) Y Public key
PRIVATEKEY VARCHAR2(1024) Y Private key
CREATEDATE DATE Y Create date
pid是表的主键,但最大值和最小值的差却小于数据量,这是怎么回事呢?
你可能会猜想:
该字段是varchar2数据类型,里面可能包含非数字字符。
但是下面查询结果是空的:
select * from TB_WOPAY_RSA where not regexp_like (pid, '^(+|[0-9]+)$');
还有什么其他想法吗?
看看下面的查询结果你就明白了:
SQL> select min(pid),max(pid+0),count(1),count(distinct pid) from wappay.TB_WOPAY_RSA;
MIN(PID) MAX(PID+0) COUNT(1) COUNT(DISTINCTPID)
---------- ---------- ---------- ------------------
0 4999999 5000000 5000000
是的,造成上面困扰的原因是查询时我们潜意识将pid转化为数字进行大小比较了。而max、min针对varchar2的大小比较是“逐位进行”的,
作为数字,4999999 > 999999
但字符串是逐位比较的,'999999' > '4999999',因为用第一位做比较时,'9'>'4'。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26451536/viewspace-2697673/ ,如需转载,请注明出处,否则将追究法律责任。