小杨心想“糟糕,又写错 SQL 语句了,这下又要面临运维和经理的混合双打了, 不行我得立马改下这条 SQL 语句,让我想想哪里出错了” ?...小杨脑袋瓜疯狂乱撞,仔细回想表结构,忽然想到,wx_id 字段是 varchar 类型,自己查询的时候竟然没有加引号。 小杨一把抢过经理手里的键盘,往 wx_id 的查询条件上加了引号,结果 ?...贴心的我帮你们翻译成了中文 1, 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 2, 两个参数都是字符串...,并且另外一个参数是常量,常量会被转换为 timestamp 6, 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数会将整数转换为 decimal 后进行比较,...id为5的那一条记录,结果把id为6的那一条也查询出来了。
查询的条件和 join 连接的字段基本都有索引,按道理不应该这样啊,于是赶紧把SQL拿下来,也没看出什么问题,于是限制查询条数再跑了一次,很快出结果了,但是结果却大跌眼镜,出来的查询结果并不是预期的。...例如算数运算符的前后是不同类型时,会将非数字类型转换为数字,比如 '5a'+2,就会将5a转换为数字类型,然后和2相加,最后的结果就是 7 。...再比如 concat函数是连接两个字符串的,当此函数的参数出现非字符串类型时,就会将其转换为字符串,例如concat(88,'就是发'),最后的结果就是 88就是发。...MySQL 官方文档有以下几条关于隐式转换的规则: 1、两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换...类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数(一般默认是 double),则会把 decimal 转换为浮点数进行比较; 在不同的数值类型之间
从结果我们可以判定,SQL1中将字符串的“1”转换为数字1,而在SQL2 中,将数字2转换为字符串“2”。 3.2 如何避免隐式类型转换?...参考MySQL文档相关描述,确定隐式类型转换规则: 1、两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换...或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp 6、有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较...结果显示同应用字符串类型参数一样,可使用索引`idx_phone`。 3.2.3 类型保持一致 最简单的一种,保证查询应用规范,SQL参数类型与数据库中字段类型保持一致即可。...同时也告诫我们日常在写SQL时一定要检查参数类型与数据库字段类型是否一致,否则可能造成隐式类型转换,不能正常应用索引,造成慢查询,甚至拖垮整个数据库服务集群。
print Convert(decimal(18,2),13.145) 结果为:13.15。...保留的小数位数; P3:如果为0或不输入,则表示进P1进入四舍五入,如SELECT ROUND(123.86,1) 结果:123.90 如果P3是不为0的数,则对P1进行截断,可以理解为不四舍五入只截断...SELECT ROUND(123.86,1,1) 结果:123.80 注意:当p2为负数时,p1在小数点的左侧舍入。...ROUND(748.58,-2) 结果:700.00 SELECT ROUND始终返回一个值。如果p2为负且大于小数点前的位数,则ROUND返回0。...ROUND(748.58,-4)结果: 0 SELECT ROUND(748.58,-3)报错:将 expression 转换为数据类型 numeric 时出现算术溢出错误。
若将查询语句改为: select id, brand from vehicle where id = '1'; 使用explain查询执行计划,扫描行数是1,即使用了主键索引。...vehicle表中id字段被定义为varchar类型,但是在第一个查询语句中,where条件中1为int类型,那么,在执行SQL时便相当于: select id, brand from vehicle...出现隐式转换的场景 翻译自MySQL 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 两个参数都是字符串...,常量会被转换为 timestamp 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal...要在编写SQL语句时养成使用explain的习惯,及时发现SQL潜在问题,避免慢SQL导致的性能问题。 最后,祝大家2023新年快乐。
翻译成人话: 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换。...,并且另外一个参数是常量,常量会被转换为 timestamp 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数...,则会把 decimal 转换为浮点数进行比较 所有其他情况下,两个参数都会被转换为浮点数再进行比较。...有兴趣的同学可以花几小时尝试破解自己公司的web~~ 3、索引中隐式转换的坑 同理,在MySQL根据索引进行查询时,如果你的username字段有索引且为varchar类型,且查询如下时: select...2、查询结果不准确 第一部分我们已经举例说明,MySQL在隐式转换时的varchar转double,会出现很多意想不到的情况,比如 “123”," 123","123a"都会转成123,实际场景中都是不允许出现的
id + place FROM Users WHERE id = 4;//返回int “105” 2.2 decimal + varchar SELECT *, id + cost FROM Users...WHERE id = 4 OR id = 5;//返回decimal “102.98”和“104.30” SELECT *, place + cost FROM Users WHERE id = 1;...//提示错误“从数据类型 varchar 转换为 numeric 时出错。”...由此可见,系统会将字符串varchar类型转化为int,若不能转换则提示错误,转换成功则进行数字计算。 3. 数字 + 数字 数字指的是int、decimal等类型。...CAST()函数可以将某种数据类型的表达式转化为另一种数据类型 CONVERT()函数也可以将制定的数据类型转换为另一种数据类型 要求:将“678”转化为数值型数据,并与123相加进行数学运算。
1、SQL语句中隐式转换的坑 先看一下官方的隐试转换说明: 翻译成人话: 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换...,并且另外一个参数是常量,常量会被转换为 timestamp 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数...,则会把 decimal 转换为浮点数进行比较 所有其他情况下,两个参数都会被转换为浮点数再进行比较。...原来字符串涉及到 +、=、-、/ 等等运算符时都会进行隐式转型,也就是转成double,那么字符串转double是怎么转的呢?...2、查询结果不准确 第一部分我们已经举例说明,MySQL在隐式转换时的varchar转double,会出现很多意想不到的情况,比如 “123”," 123","123a"都会转成123,实际场景中都是不允许出现的
可以将expr转换为以下任何数据类型 CHAR或CHARACTER:用其初始字符表示数字或字符串。 当指定为CAST或CONVERT时,不带n的VARCHAR默认长度为30个字符。...转换数字 数值可以转换为数字数据类型或字符数据类型。 当将数值结果转换为缩略值时,数值将被截断,而不是四舍五入。...例如,将98.765转换为INT返回98,转换为CHAR返回9,转换为CHAR(4)返回98.7。请注意,将负数转换为CHAR仅返回负号,将小数转换为CHAR仅返回小数点。...然而,SQL将双负号作为注释指示符; 遇到数字中的双负号时,会将该行代码的其余部分作为注释处理。 浮点数可以采用DEC、DECIMAL或NUMERIC数据类型。...将日期转换为字符数据类型可以返回完整的日期,也可以返回数据类型长度所允许的全部日期。 但是,对所有字符数据类型来说,显示格式并不相同。
背景 在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢。这个varchar字段有一个复合索引。...则会发生转换隐式 发生隐式转换的条件: 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 两个参数都是字符串...,常量会被转换为 timestamp 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal...那我们就先来分析一下索引失效的原因 由于属于隐式转换的其他情况,所以对比值都得转换为浮点数进行比较 我们先将查询条件值进行转换为浮点数,再着将表的记录值也得进行转换,所以这个时候此前已经创建好的索引排序已经不能生效了...因为隐式转换(函数)已经改变了原来的值,所以说优化器在这里就直接不选用索引,直接使用全表扫描。 查询出不匹配的值(或者说是部分匹配的值),如上面的查询结果。
在压测完成后,拿到压测过程中系统的慢SQL,发现其中一条慢SQL如下:的执行计划如下: create table user ( id varchar(32) charset utf8 not...(cast()),那么就相当于在查询SQL语句中使用了类型函数,导致无法命中索引。...翻译为中文就是: ● 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 ● 两个参数都是字符串,会按照字符串来比较...,常量会被转换为timestamp ● 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把...decimal 转换为浮点数进行比较 ● 所有其他情况下,两个参数都会被转换为浮点数再进行比较 知识扩展引用自:小米信息部技术团队-浅析MySQL的隐式转换
; 即使c的区分度更高,也必须要将d放在索引的最前列,即索引idx_d_c 要注意防止因为字段类型不同造成隐式转换,导致索引失效 创建索引有以下错误的观点: 认为一个查询就需要建一个索引 认为索引会消耗空间...,注意 count(distinct col1, col2) 如果其中一列全为NULL, 那么即使另一列有不同的值,也返回0 当某一列的值全是NULL时, count(NULL)的返回结果为0,但sum...ISNULL来判断是否为NULL值 NULL与任何值的直接比较都为NULL: NULLNULL的返回结果是NULL,而不是false NULL==NULL的返回结果是NULL,而不是true NULL...,即使所有类属性名与数据库字段一一对应,也需要定义,每一个表一定有一个POJO类对应 配置映射关系,使字段与DAO类解耦,方面维护 Sql.xml配置参数使用 #{ } 或者 #param#....类进行更新 执行SQL时,不要更新无改动的字段.一是易出错,二是效率低,三是增加binlog存储 @Transactional事务不要滥用: 事务会影响数据库的QPS 使用事务需要考虑各方面的回滚方案
特别对于有一个text/blob或很大长度的varchar字段时,更应考虑单独存储。但也要注意查询条件尽量放在一个表上。...varchar虽然存储变长字符串,但不可太小也不可太大。...SQL设计规范 5.1 所有关键字的所有字母必须大写 5.2 杜绝直接SELECT *读取全部字段 即使需要所有字段,明确指定所需字段也能减少网络带宽消耗,能有效利用覆盖索引,表结构变更对程序基本无影响...5.3 能确定返回结果只有一条时,使用LIMIT 1 在保证数据不会有误的前提下,能确定结果集数量时,多使用LIMIT,尽快地返回结果。...timestamp 有一个参数是decimal类型,如果另外一个参数是decimal或者整数,会将整数转换为decimal后进行比较,如果另外一个参数是浮点数,则会把decimal转换为浮点数进行比较
前言缘由线上问题把我坑,一查数据让我蒙闪亮主角大家好,我是JavaDog程序狗今天跟大家分享一个本狗造成的线上事故, 一个简单的SQL查询语句导致的bug你想听的故事最近狗哥有点飘,但是bug从来不会放过任何一个摸鱼的人...人话解释就是字段类型不匹配,mysql会自动转,如果你以数字0为条件,mysql就会将字段内容转成数字进行处理2.示例问题分析在MySQL中,当你尝试用整数 0 作为条件去查询一个 VARCHAR 类型的字段时...,MySQL 会尝试将 VARCHAR 字段的内容转换为数字进行比较。...查询 SELECT * FROM person WHERE sex = 0; 返回所有数据,而非仅 '0'。2.原因分析:MySQL 尝试将 VARCHAR 字段内容转换为数字进行比较。...:使用整数 0 查询 VARCHAR 字段时,MySQL 会尝试将字符串转换为数字。
); 查询结果是 1.0999999999999999。...当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。...其中,UTC表示世界统一时间,也叫作世界标准时间。 存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。...因为这个数据类型包括了完整的日期和时间信息,取值范围也最大,使用起来比较方便。毕竟,如果日期时间信息分散在好几个字段,很不容易记,而且查询的时候,SQL 语句也会更加复杂。...在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
SQL 是数据库的语言,如果你是一位使用 PostgreSQL 的 JavaScript 开发人员,那么即使你最终使用 JavaScript 客户端查询数据库,也最好对 SQL 有基本的了解。...连接后,你可以开始使用自然语言编写查询,Outerbase AI 会将你的“对话”转换为 SQL 查询。...VARCHAR, latitude DECIMAL, longitude DECIMAL ); 在下面的“对话”中,我要求 Outerbase 统计 analytics 表中每个国家的访问次数...而且毫不费力,Outerbase 编写了以下 SQL 查询,我已在浏览器中运行它以查看结果。...当你学习时,“交付文化”周围听到的“最佳实践”噪音不适用于你。当你投资自己时,速度不是一个因素。如果你花了一年时间学习 SQL,那就这样吧。SQL 是一项基础技能。
注意:从MySQL 8.0.17开始,整数数据类型不推荐使用显示宽度属性。 原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。...当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。 当数据的精度超出了定点数类型的 精度范围时,则MySQL同样会进行四舍五入处理。...使用SELECT命令查询位字段时,可以用 BIN() 或 HEX() 函数进行读取直接查询出存储的十进制数据的值。...在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。...这里的地理特征表示世界上具有位置的任何东西,可以是一个实体,例如一座山;可以是空间,例如一座办公楼;也可以是一个可定义的位置,例如一个十字路口等等。
不要放首位【建议】涉及到复杂sql时,务必先参考已有索引设计,先explain【建议】考虑使用union all,少使用union,注意考虑去重【建议】IN的内容尽量不超过200个【建议】建议在每条查询语句后面加上...Limit关键字,控制返回的数据量,防止不可控的返回大量的数据【建议】禁止大批量的查询数据结果,如果需要返回大量数据,请使用分页的方式处理,遇到分页有大的offset查询,可以使用延迟关联来解决【建议】...】数据库默认的sql_mode为严格模式(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION),在此模式下任何不支持的语法或者数据校验不合格的,都将直接返回错误【建议】...count(distinct col1, col2),如果其中一列全为null,那么即使另一列有不同的值,也返回03....当某一列的值全为null,count(col)的返回结果为0,但sum(col)的返回结果为null,因此使用sum()时需要注意空指针异常的问题。
的 PL/SQL 性质相近(不只是实现 ANSI SQL,也为自身数据库系统的特性提供实现支持),在 Microsoft SQL Server 和 Sybase Adaptive Server 中仍然被使用为核心的查询语言...除非明确说明,否则那些接受 int 表达式作为其参数的函数、语句和系统存储过程都不会改变,从而不会支持将 bigint 表达式隐式转换为这些参数,只有当参数表达式为 bigint 数据类型时,函数才返回...将 Transact-SQL 结果列、返回代码或输出参数中的数据移到某个程序变量中时,必须将这些数据从 SQL Server 系统数据类型转换成该变量的数据类型。...SQL Server 会自动将数据从一种数据类型转换为另一种数据类型。例如,将 smallint 与 int 进行比较时,在比较之前 smallint 会被隐式转换为 int。...exist() 方法(xml 数据类型) 说明如何使用 exist() 方法确定查询是否返回非空结果。
'主键' primary key, account varchar(50) not null comment '账户', amount decimal(10,...UPDATE balance set amount = 10.00 where id in(1,2); 查询SQL-全部不为NULL的情况 select sum(amount) from balance...where id in (1,2); 查询SQL-存在非NULL的情况 select sum(amount) from balance; 在存在非NULL值的情况下, SUM函数会将所有非NULL值相加...这确保了计算结果的准确性,即使在记录集中存在部分NULL值。 在实际应用中,确保对字段的NULL值进行适当处理,以避免出现意外的计算结果。...性能考虑: 在处理大量数据时,SUM函数的性能可能会受到影响。考虑使用索引、分区表、冗余字段、应用层求和计算等数据库优化技术以提高查询效率。
领取专属 10元无门槛券
手把手带您无忧上云