前言:
当前看官们对“数据库中cast”大约比较着重,大家都想要知道一些“数据库中cast”的相关文章。那么小编在网上网罗了一些有关“数据库中cast””的相关文章,希望同学们能喜欢,各位老铁们快快来了解一下吧!经常写数据库SQL脚本的朋友,难免面对数据类型转换的问题。常见的数据类型转换函数主要有CAST和CONVERT两个。在大多情况下,两种方式都能够达到我们的要求,用哪个似乎都无所谓。可事实真是这样吗?
两者之间当然是有差别的,CAST属于SQL标准的语法格式,所有的数据库都支持CAST,其语法格式也一致。CONVERT不算是SQL标准规定的语法,有些数据库支持、有些不支持,而且含义也会不同。
比如MySQL,她同时支持CAST和CONVERT,但二者之间似乎仅仅是语法格式不同而已,纯粹为了逗您玩儿呢。
再比如MSSQL,她也是同时支持CAST和CONVERT,但CONVERT除了兼容CAST的所有功能之外,还可以对日期和数字的输出进行格式化。等于说CONVERT是增强版的数据类型转换函数。
再比如PostgreSQL,她支持CAST、却不支持CONVERT语法,但提供了加强大好用的to_char函数。to_char除了名字跟CONVERT不同,功能却类似,也可以对日期时间输出进行格式化。
既然MSSQL中同时提供了CAST和CONVERT功能却稍有不同,那我们今天就以MSSQL为例,详细理一理CAST和CONVERT的共性和区别。
CAST,SQL界通用的标准语法
cast是SQL标准中定义的转换函数,其语法格式为:
cast(expression as data_type[(length)])
expression为任何有效的表达式,可以是常量、变量、表达式、字段等等。
data_type为强制转换到的数据类型。
length为指定目标数据类型长度的可选整数。默认值为30。
返回的类型,当然就是expression转换为data_type类型之后的表达式了。
看上去cast的使用还是很简单很单纯的,我们下面就写几个小例子验证下。
declare @data1 varchar(30)='123';declare @data2 varchar(30)='456';select @data1+@data2;select cast(@data1 as int)+cast(@data2 as int);
这里我们定义两个字符串变量@data1和@data2,二者如果直接相加,那就是字符串的拼凑了,通过cast强制转换为整数再相加,那就是数字求和了。运行效果如下:
怎么样,cast确实很纯粹,没太多修饰,非常直接。大多情况下,我们使用cast进行类型强制转换也基本够用了。
CONVERT,为了格式化输出而生
convert是MSSQL扩展过的类型转换函数,其语法格式与cast明显不同,参考如下:
CONVERT(data_type[(length)],expression[,style])
这里的data_type、expression和length的含义,与cast并无区别,但却多出了一个可选参数style,这才是问题的关键所在!
style是做什么的呢?
style是指定convert函数将如何转换expression的整数表达式。这里有两层含义,首先style是一个代表某种含义的整数,其次其作用是告知convert函数转换的方式,换句话说,转换成什么样的格式。style仅对expression为日期、时间和数字类型时方可生效。
从上面的论述我们可以看出,如果不考虑style这个可选参数,cast和convert是完全可以互换的,我们把cast的例子稍作改变,就会发现二者的可互换性:
declare @data1 varchar(30)='123';declare @data2 varchar(30)='456';select @data1+@data2;select cast(@data1 as int)+cast(@data2 as int);select convert(int,@data1)+convert(int,@data2);select cast(@data1 as int)+convert(int,@data2);
上面的脚本中,有varchar直接相加,有单纯使用cast转换,有单纯使用convert转换,也有cast和convert混用转换。运行效果参考下图:
我们可以看出,在convert不考虑style参数时,cast和convert除了语法格式不同之外,是完全可以互换的。当然每个人都有自己的喜好,我相信您具体应用时也不会有意把两个混着用。个人建议能用cast的就不要用convert,因为cast毕竟是标准的SQL语法,每种数据库都是兼容的,而convert可不一定能兼容哦。
CONVERT中style的应用
既然我们确认了convert是增强版的cast,除了兼容cast之外,还可以通过style参数定义日期、时间和数字的格式,我们就理一理style的应用。
针对日期和时间,style的含义请参考以下图表:
针对real和float,style的含义可参看以下图表:
针对money和smallmoney,style的含义可参看以下图表:
一直关注我的朋友,应会记得我曾经发表过一篇针对convert处理日期和时间的文章《SQLServer获取各种格式日期时间》,详细列举了通过convert和style限定日期时间的处理方式,代码我就不贴了,具体可参考下图:
隐式转换,不知不觉中把活干了
前面所说的cast和convert的应用,都归属于显示转换,即明确要求转换的类型或格式,其实还有一种转换,是数据库系统默认支持的自动类型转换,比如tinyint、smallint、int、bigint都是整数,但她们却是不同的数据类型,如果不同整数类型之间直接进行运算,数据库系统就会默认进行类型转换。
隐式转换当然是从低级到高级转换,换句话说,如果归属于同样的大类,比如数字类,那么系统会默认将低级别的类型转换为高级别的类型再进行运算。
下图是显式转换、隐式转换的准许准换类型图解,请您参考:
使用CAST和CONVERT的风险及规避
使用cast和convert时,如果转换失败,就会出现异常。很多时候我们要转换的是传入变量或不确定值的字段,SQL语法检查是感知不出转换风险的。如果我们在大段的存储过程中使用了转换函数却抛出了异常,那就太让人头疼了。
还好,微软提供了很好的解决方式。对标CAST函数,提供了TRY_CAST函数;对标CONVERT函数,提供了TRY_CONVERT函数。名字前面多出了TRY_。TRY_CAST和TRY_CONVERT也是用来做类型转换的,对应的参数也都一样,但转换错误并不会抛出异常,而是返回NULL值,如果我们配合上ISNULL函数做一个判断,这些风险和错误基本都内部消化了。
有关TRY_CAST和TRY_CONVERT的使用,这里就不再赘述了,以后有机会再展开吧。
相信您读完这篇文章,您大概就能理解cast和convert的共性和区别了。一言以蔽之,cast是标准SQL语法、所有的数据库都支持,convert是扩展语法、每种数据库的定义可能不同;cast仅支持类型转换,convert除了类型转换之外还可以指定日期、时间和数字的输出格式。孰优孰劣、如何选择,我相信您肯定会有自己的判断吧!
希望对您有所帮助!
标签: #数据库中cast