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

 更新时间:2021年11月14日 16:26:12   作者:二木成林  
varchar类型的数据是不能直接比较大小的,那么MySQL数据库中varchar类型如何进行数字比较大小的,本文就详细的介绍一下

创建测试表

-- ----------------------------
-- 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:

-- 找出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语言:

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:

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数字比较大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 的 21 个规范、优化最佳实践!

    MySQL 的 21 个规范、优化最佳实践!

    每一个好习惯都是一笔财富,本文分 SQL 后悔药,SQL 性能优化,SQL 规范优雅三个方向,分享写 SQL 的 21 个好习惯和最佳实践
    2020-12-12
  • 从零教会你如何进行前后端的数据库(MySQL)连接操作

    从零教会你如何进行前后端的数据库(MySQL)连接操作

    这篇文章主要介绍了如何从零开始实现一个完整的前后端项目,将数据存储在MySQL数据库中,并通过API进行实时的更新、查询、修改和删除操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • MySQL非空约束(not null)案例讲解

    MySQL非空约束(not null)案例讲解

    这篇文章主要介绍了MySQL非空约束(not null)案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • MySQL学习之完整性约束详解

    MySQL学习之完整性约束详解

    数据完整性指的是数据的一致性和正确性。完整性约束是指数据库的内容必须随时遵守的规则。本文就来为大家讲讲MySQL中的完整性约束,需要的可以参考一下
    2022-08-08
  • windows系统mysql压缩包版本安装过程

    windows系统mysql压缩包版本安装过程

    这篇文章主要介绍了windows系统mysql压缩包版本安装过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • mysql增量备份及断点恢复脚本实例

    mysql增量备份及断点恢复脚本实例

    生产环境中在mysql中误操作是非常正常的,所以就需要用到mysql的增量备份恢复。增量备份是我们经常用到的,它可以指定某个误操作的时间以及位置点进行数据恢复,更加准确的恢复我们想要还原的数据。
    2018-09-09
  • mysql实现合并结果集并去除重复值

    mysql实现合并结果集并去除重复值

    这篇文章主要介绍了mysql实现合并结果集并去除重复值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • MySQL普通表转换为分区表实战指南

    MySQL普通表转换为分区表实战指南

    本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表,分区表在处理庞大数据集时展现出显著的性能优势,不仅能大幅提升查询速度,还能有效简化数据维护工作,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-06-06
  • 浅谈MySQL 有哪些死锁场景

    浅谈MySQL 有哪些死锁场景

    本文主要介绍了浅谈MySQL 有哪些死锁场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论