mysql中字符和数字在执行sql时进行类型转换
来源:互联网 发布:java编程工具哪个好 编辑:程序博客网 时间:2024/06/10 23:47
转自:http://blog.csdn.net/likunlun1234/article/details/41045299
https://www.cnblogs.com/micrari/p/6358652.html
select * from v_samp_register where is_end=1;
select * from v_samp_register where is_end='1';
is_end是int型,数据库中is_end是1或者0,上面两条语句执行结果怎么就一致了呢???
因为mysql不确定是哪个版本后,执行sql时,会按where条件的类型进行类型自动转换————感觉误导人
Mysql中前边有0的数据,0会被舍去的问题
最近由于项目的需求,需要频繁地拉取不同数据库中的数据,拉取数据的过程中,各种问题,十分悲催,真所谓,一个疏忽,你就要被推倒重来...
在经历了无数次被推倒又站起来,然后又被推倒的艰苦奋斗历程之后,终于完成了数据的迁移、更新、同步、修复。总结一下这期间遇到的部分问题:
1、Mysql中前边有0的数据,0会被舍去的问题
如一条数据为0371xxx,存入数据库后数据变为371xxx
(1)如果字段类型必须为int,可以修改字段,增加zero fill,alter table 表名称 modify 字段名称 int not null zero fill;
(2)如果不必须为int,修改字段类型为字符串类型,另外sql语句中该字段数据一定要加引号,不加引号即使为字符串类型也会丢失前边的0
2、某些数据部分字段出现错误,而很多数据未出错字段又已做过修改
在数据库中增加一个isexists字段,默认为0.
主键判断数据是否存在,存在更新相应字段,不存在插入,更新与插入的数据isexists设置为1
更新完成后删除isexists为0的数据。确认数据无误后删除isexists字段。
公司项目代码中,某枚举字段数据库表中类型是char(1),在代码中,误以为是TINYINT,所以用数字筛选,后来发现结果不对。发现了一个现象,用数字0筛选会把所有的记录给筛选出来。
经过排查发现是在MySQL查询语句中,'abc'如果和'0'比较结果显然是不等的,但如果'abc'和0比较呢?结果居然是相等的。
随意测试了几下,结果如下:
mysql> select 'abc'=0;+---------+| 'abc'=0 |+---------+| 1 |+---------+1 row in set, 1 warning (0.00 sec)
mysql> select '0abc'=0;+----------+| '0abc'=0 |+----------+| 1 |+----------+1 row in set, 1 warning (0.00 sec)
mysql> select '01abc'=0;+-----------+| '01abc'=0 |+-----------+| 0 |+-----------+1 row in set, 1 warning (0.00 sec)
mysql> select '013abc'=13;+-------------+| '013abc'=13 |+-------------+| 1 |+-------------+1 row in set, 1 warning (0.00 sec)
以上几个查询通过查看MySQL给出的警告,都可以看到类似如下的信息
mysql> show warnings;+---------+------+--------------------------------------------+| Level | Code | Message |+---------+------+--------------------------------------------+| Warning | 1292 | Truncated incorrect DOUBLE value: '013abc' |+---------+------+--------------------------------------------+1 row in set (0.00 sec)
查阅MySQL 5.7官方文档中关于比较的章节,其中说明Strings are automatically converted to numbers and numbers to strings as necessary.
。也就是说在比较的时候,String是可能会被转为数字的。
而对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分
mysql> select cast('123abc' as signed);+-----------------------------+| cast('123abc' as signed) |+-----------------------------+| 123 |+-----------------------------+1 row in set, 1 warning (0.00 sec)
mysql> select cast('123.45abc' as decimal(5,2));+-----------------------------------+| cast('123.45abc' as decimal(5,2)) |+-----------------------------------+| 123.45 |+-----------------------------------+1 row in set (0.00 sec)
mysql> select cast('abc' as signed);+-----------------------+| cast('abc' as signed) |+-----------------------+| 0 |+-----------------------+1 row in set, 1 warning (0.00 sec)
```
而对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了。
关于字符串类型与整数直接进行比较的坑,说穿了就是MySQL中字符串转为数字的逻辑,没遇到过确实可能不太清楚,遇到过一次以后经验就是,看清楚数据库表字段,尽量避免字符串与数字的直接比较。
此外,书写sql语句的时候务必注意不要犯类型的错误,也许查出来的结果是对的,但是由于类型不匹配的原因,将会导致表索引无法用上。
- mysql中字符和数字在执行sql时进行类型转换
- DB2中字符、数字和日期类型之间的转换
- DB2中字符、数字和日期类型之间的转换
- DB2中字符、数字和日期类型之间的转换
- DB2中字符、数字和日期类型之间的转换
- mysql中数字类型、日期和时间类型以及字符串(字符)类型及大数据在hibernate中的配置
- SQL数字类型转换和四舍五入
- MYSQL字符数字转换
- MYSQL字符数字转换
- Mysql 数字类型转换
- MySQL 数据类型 在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
- 在C#中进行类型转换
- 在C#中进行类型转换
- 字符和数字转换
- 在hibernate中直接执行原生sql遇到类型转换问题
- MySQL中时间-->数字转换和IP地址-->数字转换
- sql转换字符到数字
- sql 数字转换为字符
- poi读取Excel时日期为数字 的解决方法
- TCP协议--TCP连接的建立和关闭
- 蚁族程序员自述:冬天盼暖气,面朝西二旗
- Qtablewidget设置某一列不可编辑
- javascript编写规范
- mysql中字符和数字在执行sql时进行类型转换
- BDTC 2017 | 中国大数据技术大会全日程和讲师曝光
- 拿什么拯救你,因硬盘故障丢失的数据!(内附恢复神器)
- 分布式Session解决方案
- XML
- Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.Cl
- 关于使用cnzz统计出现广告的情况研究说明
- matlab中fix, floor, ceil, round 函数的使用方法
- 主流数据库加载驱动程序