MySql教程

MySQL隐式转换

本文主要是介绍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语句,看看获取的结果和预期的是否一致,再进行操作,相对会更安全一些。
这篇关于MySQL隐式转换的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!