原本,想要在Mysql中进行int与bigint类型的模糊查询,必须通过Mysql的cast函数将其转为字符串后再操作,如
博客1所述
但经本人测试,Mysql5.7.25就已经支持自动进行int与bigint类型的模糊查询了,下述Sql代码可直接通过Sql测试:
SELECT id,category_id,status FROM dish WHERE (category_id LIKE "%1397844303408574465%" AND status LIKE "%1%")
这意味着什么不言而喻,以后写条件查询时,大多数场景可以直接用模糊查询替换所有包含条件,将极大的简化代码需要做的if-else判断
例如,一个多条件(未知数量与类型)查询的业务,我们仅需要一行模糊查询代码即可完成:
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
Object[] values = params.values().toArray();
Object[] keys = params.keySet().toArray();
QueryWrapper<Entity> entityQueryWrapper = new QueryWrapper<>();
for (int i = 0; i< values.length; i++){
entityQueryWrapper.like(StrUtil.toUnderlineCase(key), (String) values[i]);
这意味着什么不言而喻,以后写条件查询时,大多数场景可以直接用模糊查询替换所有包含条件,将极大的简化代码需要做的if-else判断。原本,想要在Mysql中进行int与bigint类型的模糊查询,必须通过Mysql的cast函数将其转为字符串后再操作,如。
有一个需求是要在一个云监控的状态值中存储多个状态(包括可同时存在的各种异常、警告状态)使用了位运算机制在一个int型中存储。
现在监控日志数据量非常大(亿级别)需要对数据按每小时、每天进行聚合,供在线报表使用。
状态分了3个级别:正常(0)、警告(1)、异常(2),聚合时需要使用max选择最差的状态,就需要对状态值进行处理加上级别和状态位个数,就要借助bigint型来做运算了,
问题是再将bigint 转为 int时获取原始状态值时,SQLServer报错了:
消息 8115,级别 16,状态 2,第 1 行
将 expression 转换为数据类型 int 时出现算术溢出错误。
因为状态码中
CREATE TABLE `appstat_day_prototype_201305` (
`day_key` date NOT NULL DEFAULT '1900-01-01',
`appkey` varchar(20) NOT NULL DEFAULT '',
`user_total` bigint(20) NOT NULL DEFAULT '0',
`user_activity` bigint(20) NOT NULL DEFAULT '0',
`times_total` bigint(20) N
1、TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别用8,16,24,32,64存
2、整数都有UNSIGNED可选属性 (拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 – 127。 那么如果我们在明确不需要负值存在的情况下,通常是不要设置signed来支持负数的。)
3、对于存储和计算来
mysql数据库bigint类型字段当查询条件使用
因为bigint类型会存在精度失真的问题,当字段长度后面几位相近时,拿这个类型的字段查询时会被认为是相等的,同时被查询出来。
使用该类型作为查询条件时,我是用的时下面的方法concat()将字段转为字符类型,
SELECT
WHERE
id = concat(1493140203433414658)
AND is_deleted =0
有其他处理方法的欢迎留言
QueryWrapper<User> wrapper = new QueryWrapper<>();
在QueryWrapper<>中,有很多已经编译好的方法,我们可以直接进行调用,
```bash
@Test
void test4(){
隐式类型转换可能产生非预期的结果。
何为隐式转换:即在where语句中条件的值和条件对应的列的数据类型不一致。如 where id=‘123’,而id的类型为bigint
假设有表和数据如下:
CREATE TABLE `convert_test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT
一.数值类型
Mysql支持所有标准SQL中的数值类型,其中包括严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC),以及近似数值数据类型(FLOAT,REAL,DOUBLE PRESISION),并在此基础上进行扩展。
扩展后增加了TINYINT,MEDIUMINT,BIGINT这3种长度不同的整形,并增加了BIT类型,用来存放位数据。
整数类型 字节 范围(有符号) 范围(无符号) 用途
TINYINT 1字节 (-128,127) (0,255)
网络上有许多似是而非的“谣言”,当然都不是恶意,绝大部分都是开发者不愿意自己主动研究,反而轻信其他人的信口之言。
关于数据库的谣言也有不少,比如“int性能比char高很多”。
我最近针对int、long、char、varchar进行了一次性能测试,发现它们其实并没有太大的性能差距:
备注:c8=char(8), s8=varchar(8), i8=(bigint), c4=char(4), s4=varchar(4), i4=char(4)
100w行无索引情况下查询:
执行[c8查询]20次, 平均耗时312.0ms
执行[s8查询]20次, 平均耗时334.3ms
执行[i8查
[size=xx-large][/size]因为业务逻辑比较变态要对int类型模糊查询。
用到了cast(RPT_YQ as varchar) like '"+cardYear+"%'
RPT_YQ是年度加季度的int型, 而参数cardyear 是年度,要查询该年度所有季度的数据。...
select * from tbl_role_permission where 1=1 and cast(permission_id as varchar(10)) like '125%';
select * from tbl_role_permission where 1=1 and cast(permission_id as varchar(10...