MySQL隐式转换

当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)。

  • 若字符串是以数字开头,且全部都是数字,则转换为数字结果是整个字符串,部分是数字,则转换为数字结果是截止到第一个不是数字的字符为止。
  • 若字符串不是以数字开头,则转换为数字结果是0。

理解:
varchar str = “123dafa”,转换为数字是123
SELECT ‘123dafa’ + 1; -> 124
varchar str = “aabb33”,转换为数字是0
SELECT ‘aabb33’ + 100; -> 100

比如下面的例子:
SELECT 1+‘1’; -> 2
SELECT CONCAT(2,’ test’); -> ‘2 test’
很明显,上面的SQL语句的执行过程中就出现了隐式转化。并且从结果们可以判断出,第一条SQL中,将字符串的“1”转换为数字1,而在第二条的SQL中,将数字2转换为字符串“2”。
MySQL也提供了CAST()函数。我们可以使用它明确的把数值转换为字符串。当使用CONCAT()函数的时候,也可能会出现隐式转化,因为它希望的参数为字符串形式,但是如果我们传递的不是字符串呢:
SELECT 38.8, CAST(38.8 AS CHAR); -> 38.8, ‘38.8’
SELECT 38.8, CONCAT(38.8); -> 38.8, ‘38.8’

隐式转换规则

官方文档中关于隐式转化的规则是如下描述的:

  • 两个参数至少有一个是NULL时,比较的结果也是NULL,例外是使用<=>对两个NULL做比较时会返回1,这两种情况都不需要做类型转换;
  • 两个参数都是字符串,会按照字符串来比较,不做类型转换;
  • 两个参数都是整数,按照整数来比较,不做类型转换;
  • 十六进制的值和非数字做比较时,会被当做二进制串;
  • 有一个参数是TIMESTAMP或DATETIME,并且另外一个参数是常量,常量会被转换为timestamp;
  • 有一个参数是decimal类型,如果另外一个参数是decimal或者整数,会将整数转换为decimal后进行比较,如果另外一个参数是浮点数,则会把decimal转换为浮点数进行比较;
  • 所有其他情况下,两个参数都会被转换为浮点数再进行比较。

归纳总结

  • MySQL隐式转换问题,隐藏的深,不容易被发现,在进行delete、update等操作时,一不小心很容易大问题,从而造成事故;
  • 对于delete、update等操作时,建议先使用select语句,看看获取的结果和预期的是否一致,再进行操作,相对会更安全一些。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值