MySQL数据库自动强制类型转换

MySQL数据库自动强制类型转换

在使用MySQL进行SQL语句书写是,如果出现两个操作数类型不一致时,就会出现强制类型转换。这种类型转换在方便开发者的同时,也存在很大隐患。

通过以下代码看下,类型转换的表象:

select '1aaabbb'+2 ;
select 'aaabbb1'+2 ;

执行结果依次为:

3
2

可以看到已经出现了强制类型转换。主要原因就是MySQL底层的优化器发挥作用,导致隐式类型转换。

什么是隐式类型转换

在MySQL中,当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容,则会发生隐式类型转换。

很明显,上面的SQL语句的执行过程中就出现了隐式转化。
其中,第一个SQL,根据字符串的第一位,转换为了数值1,出现了结果为3的情况。第二个SQL,字符串的第一位仍然是字符串,但是+的右边是数值,导致没有转换为数值,出现了结果为2的情况。所以不能简单的使用+号。

类型转换规则

MySQL 的类型转换遵循一定的规则,具体规则如下:

  1. 如果其中一个操作数是浮点数,则将其他操作数转换为浮点数。
  2. 如果其中一个操作数是 DECIMAL,则将其他操作数转换为 DECIMAL。
  3. 如果其中一个操作数是整数,则将其他操作数转换为整数。
  4. 如果其中一个操作数是日期或时间类型,则将其他操作数转换为日期或时间类型。
  5. 如果其中一个操作数是NULL,那么结果也将是NULL。
  6. 如果其中一个操作数是字符串,那么它将被转换为数值类型。

类型转换解决方式

不能使用简单的+号来进行连接或操作。
MySQL提供两个函数,来达到显示的强制转换。

  • CAST 函数
    CAST 函数提供了一种强制类型转换的机制,它的语法如下:

CAST(value AS type)
其中,value 是需要转换的值,type 是将其转换为的类型

  • CONVERT 函数
    CONVERT 函数与 CAST 类似,它也可以实现数据类型转化,但其语法略有差别:

CONVERT(value, type)
其中,value 是需要转换的值,type 是将其转换为的类型

项目实际意义

在项目实际中,MySQL的类型转换,可能会带来很大的问题。
构建以下代码,用于测试:

CREATE TABLE users(
	id VARCHAR(16),
	name VARCHAR(128),
	age INT
);

INSERT INTO users VALUES ('1', 'Alce',25), ('2', 'Bob', 30);

1、查询用户名称为0的数据。

select * from users c where c.name = 0 ;

查询结果为:
在这里插入图片描述
可以看到结果并未实现查询名称为0的数据,而是查询了全部的数据。

由此得出:在进行查询时,入参需要与数据库字段类型保持一致,防止查询全表的情况。所以此处应该使用string作为入参。

2、查询id+name+age的值。

select id + name + age from users;

查询结果为:
在这里插入图片描述
可以看到结果并不是几个数据的字符串拼接,而是类型转换后,将数据相加。

由此可以看到,在查询时,如果需要做字符串的拼接,是不可以简单的使用+号的。此处应该使用cast等函数来进行拼接。

总结

MySQL自身存在的自动强制类型转换,在方便开发者的同时,也存在很深的隐患。项目使用时,需要了解转换的规则,避免错误的写法,多进行实际的测试,以便保证代码的正常运行。

  • 52
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyCAT是一种开源软件,是面向企业的“大型数据库集群”。MyCAT是一个强制数据库,可以替代MySQL,并支持事务和ACID。作为企业数据库MySQL群集,MyCAT可以代替昂贵的Oracle群集。MyCAT还是一种新型的数据库,它看起来像是与内存缓存技术,NoSQL技术和HDFS大数据集成的SQL Server。作为一种新型的现代企业数据库产品,MyCAT与传统的数据库和新的分布式数据仓库相结合。总之,MyCAT是一种全新的数据库间件。 Mycat的目标是以低成本将当前的独立数据库和应用程序平稳地迁移到云端,并解决由于数据存储和业务规模的快速增长而引起的瓶颈问题。 特性: 支持SQL92标准 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用间件代理。 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster 基于Nio实现,有效管理线程,高并发问题。 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数。 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。 支持多租户方案。 支持分布式事务(弱xa)。 支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持密码加密 支持服务降级 支持IP白名单 支持SQL黑名单、sql注入攻击拦截 支持分表(1.6) 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。 优点: 1、基于阿里巴巴的开源项目Cobar,其稳定性,可靠性,出色的体系结构和性能以及许多成熟的用例使MyCAT有了良好的开端。站在巨人的肩膀上,MyCAT感到足够自信,可以走得更远。 2、MyCAT的基因整合了最好的开源项目和创新思想,使MyCAT领先于其他当前类似的开源项目,甚至超越了某些商业产品。 3、MyCAT支持强大的技术团队,该团队的参与者经验超过5年,其包括一些高级软件工程师,架构师,DBA等。优秀的技术团队可确保Mycat的产品质量。 4、MyCAT不依赖任何商业公司。它与一些开源项目不同,后者的重要特征包含在其商业产品,并使开源项目像装饰一样。   Mycat2 更新日志: v1.13 修复所有下推带有错误联合的连接 修复生成的sql带有类型转换导致mysql运算不正确 修复黑客路由器损坏 修复黑客路由器响应int类型可能超出数字范围
MyCAT是一种开源软件,是面向企业的“大型数据库集群”。MyCAT是一个强制数据库,可以替代MySQL,并支持事务和ACID。作为企业数据库MySQL群集,MyCAT可以代替昂贵的Oracle群集。MyCAT还是一种新型的数据库,它看起来像是与内存缓存技术,NoSQL技术和HDFS大数据集成的SQL Server。作为一种新型的现代企业数据库产品,MyCAT与传统的数据库和新的分布式数据仓库相结合。总之,MyCAT是一种全新的数据库间件。更新日志修复所有下推带有错误联合的连接 修复生成的sql带有类型转换导致mysql运算不正确 修复黑客路由器损坏 修复黑客路由器响应int类型可能超出数字范围Mycat的目标是以低成本将当前的独立数据库和应用程序平稳地迁移到云端,并解决由于数据存储和业务规模的快速增长而引起的瓶颈问题。MyCAT特性支持SQL92标准 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用间件代理。 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster 基于Nio实现,有效管理线程,高并发问题。 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数。 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。 支持多租户方案。 支持分布式事务(弱xa)。 支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持密码加密 支持服务降级 支持IP白名单 支持SQL黑名单、sql注入攻击拦截 支持分表(1.6) 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。MyCAT优点1、基于阿里巴巴的开源项目Cobar,其稳定性,可靠性,出色的体系结构和性能以及许多成熟的用例使MyCAT有了良好的开端。站在巨人的肩膀上,MyCAT感到足够自信,可以走得更远。 2、MyCAT的基因整合了最好的开源项目和创新思想,使MyCAT领先于其他当前类似的开源项目,甚至超越了某些商业产品。 3、MyCAT支持强大的技术团队,该团队的参与者经验超过5年,其包括一些高级软件工程师,架构师,DBA等。优秀的技术团队可确保Mycat的产品质量。 4、MyCAT不依赖任何商业公司。它与一些开源项目不同,后者的重要特征包含在其商业产品,并使开源项目像装饰一样。MyCAT截图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值