数据库为了保证SQL能够正常执行,总会提供一些友好性来满足那些看起来对的SQL正常执行,比如隐式类型转换的使用,万字不如code,来看个具体碰到的问题:
首先创建表:
create table CONVERT_SHOW ( USER_ID bigint(8), NAME varchar(8), OP_TIME timestamp default CURRENT_TIMESTAMP );
插入模拟数据:
insert into CONVERT_SHOW(user_id,name)values(0,'cast');
业务前台需要查询表中的数据时一般使用的查询SQL:
select USER_ID,NAME,OP_TIME from CONVERT_SHOW where USER_ID= ?;
一般处理这样的参数,都会以'参数值' 来替换"?",替换后的SQL可能是这样的:
select USER_ID,NAME,OP_TIME from CONVERT_SHOW where USER_ID= '查询参数';
这时,隐藏的一个陷阱就可能出现:数据库为了SQL正常工作,会使用隐式类型转换使得参数变成bigint类型,如果传递的参数不是整数会出现什么样的情况?
看看MySQL的类型转换:
select cast('查询参数' as UNSIGNED ) ;
结果是:0
如果恰好表里存在一条user_id为0的数据,就会被返回,接着就是让人的各种着急,连在Google上使用那些关键字上来查找原因都比较难描述^_^
如果前端能够做到对参数进行类型校验,肯定可以避免问题出现,但大多时候都是无心挖出来的坑,那真是满头的黑线啊!!!
相关推荐
需要注意的是,operator type()是一种隐式类型转换,编译器会自动将对象转换为目标类型,因此在编程时需要小心地区分类型转换的方向和方式,以免出现类型转换错误。 C++隐式类型转换运算符operator type()是一种...
在SQL Server中,数据类型隐式转换是一种自动将一种数据类型转换为另一种数据类型的过程,通常发生在不同数据类型的值进行操作或比较时。虽然这种转换能够简化编程,但如果不了解其工作原理,可能会引发意料之外的...
在MySQL中,处理字符串与数字的比较时,需要特别小心隐式转换问题。为了避免这种情况的发生,需要采取一些措施。首先,尽量保证在比较的时候使用相同的数据类型。其次,在查询条件中显式地指定数据类型,例如使用...
### 数据类型转换详解 在计算机科学领域,尤其是在嵌入式系统开发中,数据类型转换是一项基本而重要的技术。本文将围绕“数据类型转换”这一主题展开深入探讨,并结合STM32平台的应用背景进行分析。 #### 标题:...
隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。但是,因为隐式转换不需要程序员将一种类型显式强制转换 为另一种类型,所以使用隐式转换时必须格外小心,以免出现意外结果。一般情况下,隐式转换...
虽然隐式转换通常较为安全,但在处理大型数据或复杂的类型转换逻辑时,必须小心潜在的数据丢失或异常。而强制转换虽然提供了更大的灵活性,但应谨慎使用,确保转换不会引入错误或不可预测的行为。在编程时,应该始终...
通常情况下,编译器会自动进行隐式类型转换,但如果涉及到复杂的类型转换或跨类转换,则需要开发者显式地使用强制类型转换。本文通过两个类`lx`和`lx2`之间的转换来演示这一过程。 #### 类定义与继承 首先定义了两...
#### 隐式类型转换的注意事项 隐式转换虽然方便,但它可能会带来一些不易察觉的问题。例如: - 当我们预期进行数值加法时,如果变量实际上是字符串,可能会导致意外的行为。 - 在进行条件判断时,某些变量可能因为...
在这个例子中,虽然没有发生溢出,但因为没有进行类型转换,编译器可能需要更复杂的步骤来处理这个运算,生成的机器代码可能会比预期的多,影响程序的效率。 例3: ```c unsigned long int b; unsigned int x; x = ...
本文将详细介绍C++中的类型转换机制,包括隐式转换(Implicit Conversion)和显式转换(Explicit Conversion),以及它们的具体应用场景。 #### 隐式转换(Implicit Conversion) 隐式转换是指在不使用任何特定...
在比较或操作变量时,要小心隐式类型转换。例如,`'2' === 2` 是 true,因为它们会被转换为相同的类型进行比较。理解`==`和`===`的区别是避免这类错误的关键。 3. **函数参数默认值** 当定义函数并给参数设置...
- **定义**:隐式转换是指在无需程序员明确指定的情况下,编译器自动进行的类型转换。 - **示例**:从int到double的转换就是一个典型的隐式转换过程,因为double可以精确表示int类型的所有值。 - **注意事项**:...
在JavaScript开发中,类型转换是一项常见的任务,尤其是在处理不同类型的数据时。"converity"这个术语可能是一个拼写错误,应该是"convertity"或者"convert",在这里指的是转换能力。在这个场景下,它强调了在...
static_cast 是一种静态类型转换,它可以将一个类型的对象转换为另一个类型,但前提是这两个类型之间存在继承关系或隐式转换关系。static_cast 会在编译期检查转换的合法性,如果转换不合法,编译器将 报错。 例如...
Java 中的类型转换问题详解 Java 是一种强数据类型的语言,数据类型之间的转换有着固定的规则。...Java 中的类型转换问题需要我们格外小心,了解自动类型转换和强制类型转换的区别,避免类型转换时的溢出和截断问题。
在C语言编程中,表达式的求值是一块重要的知识领域,它涉及到隐式类型转换、算术转换、操作符的优先级、结合性和求值顺序等诸多小细节。本文档通过一系列问题来探讨C语言中关于表达式求值的这些小细节。 首先,我们...
然而,对于更复杂的情况,如涉及到不同长度的整型之间操作时,就必须小心处理类型转换。 另一个示例: ```c uint16_t a = 10; uint16_t b = 65531; uint32_t c = 0; uint32_t d; d = a + b + c; ``` 在这个例子中...
C#支持隐式和显式类型转换,如`Convert.ToInt32()`、`(string)obj`等。理解何时和如何进行类型转换是避免运行时错误的关键。 3. **安全代码(Safe Code)**: C#主要是安全代码,这意味着它防止了如空指针异常、...
explicit表示显式转换,如从A到B必须进行强制类型转换(B = (B)A),而implicit表示隐式转换,如从B到A只需直接赋值(A = B)。显式转换需要开发者显式地调用转换运算符,而隐式转换可以在编译时自动进行转换。 ...