[转帖]浅析SQL数据类型的隐式转换与显式转换以及隐式转换可能导致的问题
https://www.cnblogs.com/goloving/p/15222604.html
一、隐式类型转换问题
1、隐式类型转换:
比如:SELECT 1 + '1';
2、隐式类型转换的问题:
(1)程序可读性差,且依赖数据库的隐式转换规则,效率差,会增加处理时间;且如果数据库升级,则程序可能无法正确执行;
(2)有可能会导致索引失效;
(3)有可能会导致意想不到的结果;
3、显式类型转换:SELECT 1 + CAST('1' AS SIGNED INT);
4、原则:尽量用显式类型转换。
5、隐式转换问题示例:
(1)数值型 + 字符型
SELECT 1+'1'; -- 结果:2
SELECT CONCAT('北京',2008); -- 结果:北京2008
SELECT '北京' + 2008; -- 结果: 可能2008,可能报错
SELECT 'HELLO ' + 'WORLD!'; -- 结果:可能 0,可能报错
(2)隐式类型转换导致索引失效

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类型;

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

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加上单引号就可以了;

二、SQL 数据类型转换
数据类型转换分为隐式转换和显式转换。
1、显式转换:顾名思义就是使用函数进行数据类型转化,如cast、convert
2、隐式转换问题

-- 例子1
SELECT 1+ ‘1’ –返回值为2 -- 例子 2
SELECT
CASE
WHEN 1 > 1 THEN 10
WHEN 1 = 1 THEN ‘10’
WHEN 1 < 1 THEN 10.2
END -- 返回值为10.2 -- 例子3
SELECT
CASE
WHEN 1 > 1 THEN 10
WHEN 1 = 1 THEN ‘abc’
WHEN 1 < 1 THEN 10.2
END -- 语法错误

在第一个例子中,'1' 被转换为 int 的 1 ;
在第二个例子中,不管那个后面的条件成立,结果都被转换为decima;
第三个例子由于‘ab’转换为decimal失败,所以报错。
为什么呢? —— 这是因为 sql server 中有多个数据类型在一个表达式中时会存在隐式的转换,各个数据类型的优先级如下:

1、用户定义数据类型(最高)
2、sql_variant
3、xml
4、datetime
5、smalldatetime
6、float
7、real
8、decimal
9、money
10、smallmoney
11、bigint
12、int
13、smallint
14、tinyint
15、bit
16、ntext
17、text
18、image
19、timestamp
20、uniqueidentifier
21、nvarchar(包括 nvarchar(max))
22、nchar
23、varchar (包括 varchar(max))
24、char
25、varbinary(包括 varbinary(max))
26、binary(最低)

当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。 如果此转换不是所支持的隐式转换,则返回错误。 当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。
这里有一篇文章也说了这个 case when 里的隐式转换导致的问题,可以看下:《SQL Server有意思的数据类型隐式转换问题》
[转帖]浅析SQL数据类型的隐式转换与显式转换以及隐式转换可能导致的问题的更多相关文章
- SQL反模式学习笔记19 使用*号,隐式的列
目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...
- VB.Net隐式转换和显式转换的方法(转)
VB.Net隐式转换和显式转换的方法(转) “隐式转换”不需要源代码中的任何特殊语法.在下面的示例中,在将 k 的值赋给 q 之前,Visual Basic 将该值隐式转换成单精度浮点值. Dim ...
- C#中的类型转换-自定义隐式转换和显式转换
目录 前言 基础知识 示例代码 实际应用 问题 答案 报错 用户定义的转换必须是转换成封闭类型,或者从封闭类型转换 参考 其他 应用和设计 读音 参考 前言 有时我们会遇到这么一种情况:在json数据 ...
- SQL数据类型解释
SQL数据类型解释 1.char.varchar.text.ntext.bigint.int.smallint.tinyint和bit的区别及数据库的数据类型电脑秘籍 2009-05-15 21:47 ...
- SQLServer学习笔记<>sql的范围内查找,sql数据类型,字符串处理函数
sql的范围内查找 (1)between.....and用法 通常情况下我们查找一个在某固定区域内的所有记录,可以采用>=,<=来写sql语句,例如:查找订单价格在1000到2000之间的 ...
- java数据类型,hibernate数据类型,标准sql数据类型之间的对应表
Hibernate API简介 其接口分为以下几类: l 提供访问数据库的操作的接口: l 用于配置Hibernate的接口: l 回调接口 l ...
- Java数据类型与SQL数据类型的映射
Java数据类型与SQL数据类型的映射 SQL Data Type Java Data Type char/varchar/longvarchar String numeric/decimal jav ...
- 【转帖】oracle数据类型和对应的java类型
原文地址:http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.ht ...
- SQL数据类型(SQL Server六个类型使用)
SQL数据类型是一个属性,它指定任何对象的数据的类型.在SQL中每一列,变量和表达有相关数据类型. 当创建表时,需要使用这些数据类型. 会选择根据表列要求选择一个特定的数据类型. SQL Server ...
- Java,Hibernate,标准sql数据类型之间的对应表
(2010-07-14 19:53:50) 转载▼ 标签: 杂谈 分类: JAVA Hibernate API简介 其接口分为以下几类: l 提供访问数据库的操作的接口: l ...
随机推荐
- Pikachu漏洞靶场 敏感信息泄露
敏感信息泄露 概述 由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到. 比如: 通过访问url下的目录,可以直接列出目录下的文件列表; 输入错误的url参数后报错信息里面 ...
- Next.js 开发指南 路由篇 | 动态路由、路由组、平行路由和拦截路由
前言 实际项目开发的时候,有的路由场景会比较复杂,比如数据库里的文章有很多,我们不可能一一去定义路由,此时该怎么办?组织代码的时候,有的路由是用于移动端,有的路由是用于 PC 端,该如何组织?如何有条 ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG
斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG 斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章的目标是 ...
- Python借助企业微信群机器人发送消息、图片和文件
企业微信功能日益强大,腾讯官方也提供了丰富的API供开发者实现企业微信的很多自动化场景.比如,如何给某个企业微信群发送消息.图片或者文件,甚至@指定群用户?别急,看小爬君轻松教会大家. Step1:在 ...
- flutter弹窗
AlertDialog: 优点:Material风格的弹窗,具有灵活的布局和样式自定义能力.易于使用,并提供了标题.内容和操作按钮的选项. 缺点:对于复杂的自定义布局和样式可能不够灵活. Bottom ...
- DWS临时内存不可用报错: memory temporarily unavailable
本文分享自华为云社区<DWS临时内存不可用报错: memory temporarily unavailable>,作者:漫天. 1.定位报错的DN/CN 当出现memory tempora ...
- 云图说|图解开天企业工作台MSSE
摘要:开天企业工作台是面向企业用户的一站式数字工作台. 本文分享自华为云社区<[开天aPaaS]图解开天企业工作台MSSE>,作者:开天aPaaS小助手. 开天企业工作台(MacroVer ...
- 应对全场景AI框架部署挑战,MindSpore“四招”让你躺平
摘要:所谓全场景AI,是指可以将深度学习技术快速应用在云边端不同场景下的硬件设备上,包括云服务器.移动终端以及IoT设备等等,高效运行并能有效协同. 本文分享自华为云社区<AI框架的挑战与Min ...
- 想从单体架构演进到分布式架构,SBA 会是一个不错的选择
摘要:SBA 可以看成是单体架构和微服务架构之间的一个折中方案,它也是按照业务领域进行服务划分,但服务划分的粒度相比微服务要更粗.从单体架构演进到 SBA,会比直接演进到微服务架构更加容易. 本文分享 ...
- HTML代码混淆技术:原理、应用和实现方法详解
HTML代码混淆是一种常用的反爬虫技术,它可以有效地防止爬虫对网站数据的抓取.本文将详细介绍HTML代码混淆技术的原理.应用以及实现方法,帮助大家更好地了解和运用这一技术. 一.HTML代码混淆的 ...