关于Mysql中between and使用于varchar类型数据的一个坑

关于Mysql中between and使用于varchar类型数据的一个坑

今天在一个交流群里面,一个群友问了一个问题:为啥表里面没有符合条件的数据,但查询出来的结果显示有10条?以下是相关的表数据、表结构以及sql语句
表数据:在这里插入图片描述
表结构:

在这里插入图片描述

查询语句:
在这里插入图片描述

然后,当时刚好看到了这个问题,我就进行了下研究,随着研究的不断深入,发现这个问题并不简单。

好了,废话不多说,接下来就讲一下原因吧:
原来,在Mysql中,当你对varchar类型的数据与数字进行比较时(between and 也是一种比较嘛),会把varchar类型的数据(如:six)转换成数字0,还会把以0开头的数据当作数字0(如0four,同理把以1开头会当做数字1),举个例子:
select * from test where age between 0 and 19,当数据库存在age为six,five,0four的数据时,mysql都会把它转换为0,所以会认为six,five ,0four是满足条件的:
在这里插入图片描述
换为1到18的就只有一条数据了:
在这里插入图片描述
2开头的则为认为为数字2:

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的停车场管理系统的MySQL数据库与Python程序的设计,供参考。 1. 停车场表 (parking_lot) 字段名 | 类型 | 描述 ---|---|--- id | int | 停车场编号 name | varchar | 停车场名称 address | varchar | 停车场地址 total_spaces | int | 总车位数 available_spaces | int | 可用车位数 ```mysql CREATE TABLE parking_lot ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, total_spaces INT NOT NULL, available_spaces INT NOT NULL ); ``` 2. 停车位表 (parking_space) 字段名 | 类型 | 描述 ---|---|--- id | int | 停车位编号 parking_lot_id | int | 所属停车场编号(外键) status | int | 停车位状态(0:空闲,1:已占用) ```mysql CREATE TABLE parking_space ( id INT PRIMARY KEY AUTO_INCREMENT, parking_lot_id INT NOT NULL, status INT NOT NULL, FOREIGN KEY (parking_lot_id) REFERENCES parking_lot(id) ); ``` 3. 车辆表 (vehicle) 字段名 | 类型 | 描述 ---|---|--- id | int | 车辆编号 plate_number | varchar | 车牌号 enter_time | datetime | 进入停车场时间 exit_time | datetime | 离开停车场时间 parking_space_id | int | 所属停车位编号(外键) ```mysql CREATE TABLE vehicle ( id INT PRIMARY KEY AUTO_INCREMENT, plate_number VARCHAR(20) NOT NULL, enter_time DATETIME NOT NULL, exit_time DATETIME, parking_space_id INT, FOREIGN KEY (parking_space_id) REFERENCES parking_space(id) ); ``` 4. Python程序实现 ```python import mysql.connector from datetime import datetime # 初始化数据库连接 mydb = mysql.connector.connect( host="localhost", user="root", password="password", database="parking_system" ) # 获取游标 mycursor = mydb.cursor() # 进入停车场 def enter_parking_lot(plate_number): # 查询可用车位 mycursor.execute("SELECT id FROM parking_space WHERE status=0 LIMIT 1") parking_space = mycursor.fetchone() if parking_space is None: print("停车场已满,请稍后再试") return # 更新停车位状态 mycursor.execute("UPDATE parking_space SET status=1 WHERE id=%s", (parking_space[0],)) mydb.commit() # 插入车辆信息 enter_time = datetime.now() sql = "INSERT INTO vehicle (plate_number, enter_time, parking_space_id) VALUES (%s, %s, %s)" val = (plate_number, enter_time, parking_space[0]) mycursor.execute(sql, val) mydb.commit() print("车辆%s已停入停车位%s,停车开始时间:%s" % (plate_number, parking_space[0], enter_time)) # 离开停车场 def exit_parking_lot(plate_number): # 查询车辆信息 mycursor.execute("SELECT id, enter_time, parking_space_id FROM vehicle WHERE plate_number=%s AND exit_time IS NULL", (plate_number,)) vehicle = mycursor.fetchone() if vehicle is None: print("未找到车辆%s,请检查车牌号是否正确或是否已离开停车场" % plate_number) return # 更新车辆信息 exit_time = datetime.now() sql = "UPDATE vehicle SET exit_time=%s WHERE id=%s" val = (exit_time, vehicle[0]) mycursor.execute(sql, val) mydb.commit() # 更新停车位状态 mycursor.execute("UPDATE parking_space SET status=0 WHERE id=%s", (vehicle[2],)) mydb.commit() # 计算停车费用 duration = (exit_time - vehicle[1]).total_seconds() / 3600 mycursor.execute("SELECT hourly_rate FROM fee_rule WHERE %s BETWEEN start_time AND end_time", (exit_time.time(),)) hourly_rate = mycursor.fetchone()[0] total_fee = round(duration * hourly_rate, 2) print("车辆%s已离开停车位%s,停车结束时间:%s,停车费用:%s元" % (plate_number, vehicle[2], exit_time, total_fee)) # 测试 enter_parking_lot("粤B12345") exit_parking_lot("粤B12345") ``` 以上是一个简单的停车场管理系统的MySQL数据库与Python程序的设计,可以根据实际需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值