数据库里存的是字符串,表示数字,在接口查询的时候需要进行数字大小的比较,下面记录几种常见的方式
数字和字符串比较
MySQL字符串和数字比较时会把字符串类型转成整数类型,从首字母开始,遇到非数字类型后终止。
而对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分,而对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了。
select cast('123abc' as signed); # 123
select cast('123.45abc' as decimal(5,2)); # 123.45
select cast('abc' as signed); # 0
原文:https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html
Comparison operations result in a value of 1 (TRUE), 0 (FALSE), or NULL. These operations work for both numbers and strings. Strings are automatically converted to numbers and numbers to strings as necessary.
对于数据开头的字符串,转成数字后会自动丢弃后面的字母部分,只留下纯数字进行比较
对于没有数字的那些字符串,与数值进行比较的时候,就只剩下0去和其他数值进行比较了
# 对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了。就只剩下0去和其他数值进行比较了。
select 'abc' = 0; # 1
SELECT "a2bc" < 2; # 1
# 对于数据开头的字符串,转成数字后会自动丢弃后面的字母部分,只留下纯数字进行比较
select 11 > '010abc'; # 1, 11和010进行比较
select '01abc' > 0; # 1, 01和0进行比较
注意
- 尽量避免字符串与数字的直接比较,由于类型不匹配的原因,将会导致表索引无法用上。
to_number
如果数据库里面是以字符串存储数字的,这个时候要进行数字形式的比较,Oracle中可以用to_number()
函数,它可以将char或varchar2类型的字符串转换为一个number类型的数值,需要注意的是,被转换的字符串必须符合数值类型格式,如果被转换的字符串不符合数值型格式,Oracle将抛出错误提示;
MySQL的话可以使用CAST()
和CONVERT()
函数,具体用法就不赘述了
代码比较
如果是整数,使用BigInteger,小数则使用BigDecimal
public static int compareNumbers(String num1, String num2) {
// 将字符串转换为 BigDecimal
BigDecimal bd1 = new BigDecimal(num1);
BigDecimal bd2 = new BigDecimal(num2);
// 比较两个 BigDecimal 对象
return bd1.compareTo(bd2);
}
compareTo方法返回值有 3 种:
- 0 如果两个数字相等
- -1 如果第一个数字小于第二个数字
- 1 如果第一个数字大于第二个数字
如果不使用 BigInteger 和 BigDecimal 的话,则需要按位进行比较,有小数的话需要小数部分和整数部分分开进行比较
字符串与字符串比较
MySQL和Oracle字符串之间比较大小是逐位从高位到低位按ascii码逐个比较,所以字符串类型的数字18<2
SELECT '18' < '2' # 1