MySQL数据库中varchar类型的数字比较大小的方法

吾爱主题 阅读:152 2024-04-02 08:07:10 评论:0

创建测试表

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 -- ---------------------------- -- table structure for check_test -- ---------------------------- drop table if exists `check_test`; create table `check_test` (    `id` int (11) not null auto_increment,    `current_price` varchar (10) not null ,    `price` varchar (10) not null ,    primary key (`id`) ) engine=innodb auto_increment=9 default charset=utf8;   -- ---------------------------- -- records of check_test -- ---------------------------- insert into `check_test` values ( '1' , '12' , '14' ); insert into `check_test` values ( '2' , '22' , '33' ); insert into `check_test` values ( '3' , '15' , '8' ); insert into `check_test` values ( '4' , '9' , '7' ); insert into `check_test` values ( '5' , '12' , '12.9' );

我们执行如下sql:

?
1 2 3 4 5 6 7 -- 找出current_price比price小的记录 select * from check_test where current_price<price; select * from check_test where (current_price+0)<(price+0);   -- 找出current_price比price大的记录 select * from check_test where current_price>price; select * from check_test where (current_price+0)>(price+0);

结果如下:

 我们可以看到在结果1中15>8不符合条件却查询到了,而结果3中15>8满足条件却并没有查询出来。

这是为什么呢?因为字符串类型的数字比较大小是从第一位开始比较其在字符编码中对应的数值大小,相等则继续比较第二位,不相等就是数值大的为大。其中数字字符对应的ascii码值如下:

 例如:

  • 如果current_price="12"、price="14",其中第1位字符"1"所对应的ascii十进制数值都是49,二者相等,而第二位字符"2"的ascii十进制数值是50,"4"的ascii十进制数值是52,50<52,所以结果正确。
  • 如果current_price="15"、price="8",其中current_price中的第1位字符"1"所对应的ascii十进制数值是49,而price中的第1位字符"8"所对应的ascii十进制数值是56,49<56,所以能够查询出来,但却并不是我们期望的结果。

我们可以通过代码来进行验证,这里用的是javascript语言:

?
1 2 3 4 5 6 7 var current_price = "12" ; var price = "14" ; console.log(current_price < price);// true   var current_price = "15" ; var price = "8" ; console.log(current_price < price);// true

所以对于可能要比较大小的数字不应该设置为varchar类型,但如果已经设置为了varchar类型,那么如果要比较则将其转换成数值类型进行比较,在sql中中对字段加0即可。

而如果是编程语言则需要通过对应的函数进行转换,不能加0直接转换,如javascript:

?
1 2 3 4 5 6 7 var current_price = "12" ; var price = "14" ; console.log(parseint(current_price) < parseint(price));// true   var current_price = "15" ; var price = "8" ; console.log(parseint(current_price) < parseint(price));// false

注意:字符所对应的十进制数值跟其编码有关系,但ascii码都被兼容。

参考链接:

字符串类型的数字比较大小

varchar类型的字符串比较大小

varchar类型的数字比较大小

到此这篇关于mysql数据库中varchar类型的数字比较大小的方法的文章就介绍到这了,更多相关mysql varchar数字比较大小内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/cnds123321/article/details/118890787

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容