[转帖]浅析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 ...
随机推荐
- QNX 性能分析工具
QNX 性能分析工具 小结 hogs:列出最占用 CPU/RAM 的进程,可以统计内存占用详细情况[可单个进程] pidin:显示进程信息.系统信息.库信息...[可单个进程] ps:显示进程信息[可 ...
- C#/.NET学习值得推荐的在线论坛和技术社区
前言 本文来源于知乎的一个提问,C#/.NET程序员学习有哪些值得推荐的在线论坛和技术社区?其实很早之前DotNetGuide就已经新增了C#/.NET/.NET Core充电站栏目,当然大家有更好的 ...
- Flutter GetX的事件监听
Flutter GetX的事件监听 import 'package:flutter/material.dart'; import 'package:flutter_code/page/book/boo ...
- 常用的 SQL
只知道字段名字查找表 SELECT table_name FROM information_schema.columns WHERE column_name = '字段名'; 查看不等于NULL的数据 ...
- FreeMark模板基本知识
FreeMarker模板基础知识 1.FreeMarker与jsp.Thymeleaf并排为三大模板引擎,用于把后端数据渲染到页面上,降低耦合度.动态数据+占位符+静态页面标签构成动态页面. 2.Fr ...
- 初学开发必看:何为Git,何为SVN
摘要:在和客户交流代码开发的过程中,时常会先入为主的交流起Git:但在和很多中小型企业交流的过程,发现SVN的模式也被使用得很频繁.那么两者的具体差异有哪些呢? 本文分享自华为云社区<Git V ...
- SAST + SCA: 结合使用安全升级
据 SAP 称,当今85%的安全攻击针对的是软件应用程序,因此一些列应用程序安全测试工具也应运而生.为了避免这些恶意攻击,企业通常使用应用程序安全测试工具来去缓解和解决安全风险,而不同的工具对应的使用 ...
- Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
无状态和有状态 无状态 Deployment 认为Pod 都是一样的.javademo1-6fb64c4664-dj4dh.javademo1-6fb64c4664-dj54s 它们的内容是一样的. ...
- Jenkins Blue Ocean
介绍 Blue Ocean 是 pipeline 的可视化UI.同时兼容经典的自由模式的 job.Jenkins Pipeline 从头开始设计,但仍与自由式作业兼容,Blue Ocean 减少了经典 ...
- 互联网公司Python高性能编程
虽然Python一直被吐槽执行速度慢,但是架不住简洁的语法和丰富的第三方库使其能够节省开发时间.众所周知在互联网公司中要求频繁的迭代.快速的上线,而Python的优点就特别适合这种需求,所以Pytho ...