一、隐式类型转换

1、隐式类型转换

隐式类型转换:SELECT 1 + '1';
程序可读性差,且依赖数据库的隐式转换规则,如果数据库升级,则程序可能无法正确执行; 有可能会导致索引失效; 有可能会导致意想不到的结果; 显式类型转换:SELECT 1 + CAST('1' AS SIGNED INT); 尽量用显式类型转换;

2、数值型 + 字符型

SELECT 1+'1';            结果:2

SELECT CONCAT('北京',2008);    结果:北京2008

SELECT '北京' + 2008;        结果:2008

SELECT 'HELLO ' + 'WORLD!';    结果:0

3、隐式类型转换导致索引失效

##
CREATE TABLE teacher(
teacher_id VARCHAR(50),
teacher_name VARCHAR(50),
id_no VARCHAR(50)
); CREATE INDEX idx_teacher_id ON teacher(teacher_id); ##
CREATE TABLE student(
student_id INT,
student_name VARCHAR(50),
teacher_id INT
); CREATE INDEX idx_teacher_id ON student(teacher_id); ##
SELECT
*
FROM student a
INNER JOIN teacher b
ON a.teacher_id = b.teacher_id; 此时不会走索引,因为在teacher表中,teacher_id是varchar类型,而student表中teacher_id是int类型,
会做隐式类型转换,把varchar转为int类型;

4、隐式类型转换导致意想不到的结果

##
依据上面的建表语句,建表并插入以下数据:
INSERT INTO teacher VALUES('20180204060001','李斌','530102192005080114');
INSERT INTO teacher VALUES('20180204060002','张成','530102192005080115'); 以下语句会返回两条结果,因为teacher_name是varchar型的,要先转为int型,varchar转int型就变成了0
SELECT COUNT(*) FROM teacher WHERE teacher_name = 0;
| |(等价)
SELECT COUNT(*) FROM teacher WHERE CAST(teacher_name AS SIGNED INT) = 0; 这种操作还是很危险的,因为当执行删除语句时,可能会删错;
DELETE FROM teacher WHERE teacher_name = 0; ##
SELECT COUNT(*) FROM teacher WHERE teacher_name = 0;
为什么不是等价于:
SELECT COUNT(*) FROM teacher WHERE teacher_name= '0'; 因为隐式类型转换时,转的是左边而不是右边; ##
以下语句会返回两条信息,而不是一条,因为530102192005080114这串数字,已经超过了int类型的范围,
超过了int类型的范围就会转为float类型,等号两边都转为float类型,会丢精度,也就是最后一位数丢了,剩下的就相等了,就全返回了; SELECT COUNT(*) FROM teacher WHERE id_no = 530102192005080114;
等价于:
SELECT COUNT(*) FROM teacher WHERE
CAST(id_no AS DECIMAL) = CAST(530102192005080114 AS DECIMAL); 在查询时把530102192005080114加上单引号就可以了;

5、其他数据库转换导致意想不到的结果

在Teradata数据库中:
SELECT 10/4; 结果:2 解决:可以把分母分子乘以1.00,再运算 SELECT COUNT(*) FROM table1; count返回的是int类型,如果表中数据量超过count出来的数,就报错
解决:在count(*) 外面cast转换一下,转换为能保存结果的类型

SQL进阶-隐式类型转换的更多相关文章

  1. C++进阶--隐式类型转换

    //############################################################################ /* 隐式类型转换 * * 类型转换可分为 ...

  2. ORACLE中内部函数SYS_OP_C2C和隐式类型转换

    什么是SYS_OP_C2C呢?官方的介绍如下: SYS_OP_C2C is an internal function which does an implicit conversion of varc ...

  3. ORACLE隐式类型转换

      隐式类型转换简介   通常ORACLE数据库存在显式类型转换(Explicit Datatype Conversion)和隐式类型转换(Implicit Datatype Conversion)两 ...

  4. js条件判断时隐式类型转换

    Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

  5. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

  6. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  7. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  8. C++的隐式类型转换

    C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...

  9. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

随机推荐

  1. java异常的嵌套和级联

    一.分开捕获或者嵌套使用 我们先看看下面这段代码: public class Cal { public int div(int a, int b) { int result = a / b; retu ...

  2. C#简单构架之EF进行读写分离+多数据库Mysql/SqlServer

    http://www.php361.com/index.php?c=index&a=view&id=3857 不建议用,太重的框架EF,仅仅参考一下别人的思路就好. [导读]最近因为项 ...

  3. HTML+CSS+JS综合练习(动态验证版)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Java基础篇(下)

    6.Java面向对象的三个特征与含义 三大特征是:继承.封装和多态. (1)继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得 ...

  5. Spring MVC异常友好展示

    官网 https://docs.spring.io/spring/docs/4.3.25.RELEASE/spring-framework-reference/htmlsingle/ Springmv ...

  6. 【MySQL】MySQL高可用架构之MHA

    一.关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到master节 ...

  7. 使用node+vue实现简单的WebSocket聊天功能

    最近学习了一下websocket的即时通信,感觉非常的强大,这里我用node启动了一个服务进行websocket链接,然后再vue的view里面进行了链接,进行通信,废话不多说,直接上代码吧, 首先, ...

  8. 英语gzibeads天珠gzibeads单词

    天珠英语是gZiBeads,藏语叫(si , 斯)汉语译为“斯”或“瑟”,又称“天降石”.在<藏汉大辞典>里天珠的解释为:“亚玛瑙,猫睛石,一种宝石,俗称九眼珠.入药能治脑溢血”.最早的天 ...

  9. C/ C++ 快速上手

    C++ 快速上手 (一)https://www.cnblogs.com/cosmo89929/archive/2012/12/22/2828745.html C++ 快速上手 (二)https://w ...

  10. ML- 线性回归推导

    线性回归, 这部分算是我最为擅长的了, 真的不吹, 6年经验, 我高中时代就已经会推导了, 当然是最最小二乘法和统计学(假设检验, 参数分布等)的角度. 后来上了大学, 又是从最小二乘和统计学角度, ...