您的位置:首页 > 数据库 > MySQL

cast 和convert和concat详解以及mysql和sqlserver兼容问题

2013-10-18 08:56 357 查看
love聊网络那点事:http://weibo.com/u/3923942488
总结:

以下这条仅仅适用于mysql

SELECT{fnCONCAT(CONVERT(user_id,CHAR),USER_NAME)}ASstrFROMt_sys_user

以下这条仅仅适用于sqlserver2008

SELECT{fnCONCAT(CONVERT(CHAR,user_id),USER_NAME)}ASstrFROMt_sys_user

以下这条sqlserver和mysql兼容

SELECT{fnCONCAT(CAST(user_idASCHAR),USER_NAME)}ASstrFROMt_sys_user

注释:cast是类型转换函数,sqlserver和mysql通用。

convert也是类型转换,在sqlserver2008和mysql中均存在,但是参数顺序相反。

concat函数在sqlserver2008和mysql中均有,但是在sqlserver2008中需要这样适用{fnconcat(arg0,arg1,.....)}且不适用与int类型和varchar类型连接。sqlserver2008中字符串连接一般用“+”号。不过在sqlserver2012中好像支持直接使用concat函数。

mysql可以转换成的类型限制:

就是CAST(xxxAS类型),CONVERT(xxx,类型)。

可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

二进制,同带binary前缀的效果:BINARY
字符型,可带参数:CHAR()
日期:DATE
时间:TIME
日期时间型:DATETIME
浮点数:DECIMAL
整数:SIGNED
无符号整数:UNSIGNED

以下部分为转载以上部分为自己总结。

sqlserver

将某种数据类型的表达式显式转换为另一种数据类型。CAST和CONVERT提供相似的功能。
语法

使用CAST:
CAST(expressionASdata_type)
使用CONVERT:
CONVERT(data_type[(length)],expression[,style])
参数

expression
是任何有效的Microsoft®SQLServer™表达式。有关更多信息,请参见表达式。
data_type
目标系统所提供的数据类型,包括bigint和sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。
length
nchar、nvarchar、char、varchar、binary或varbinary数据类型的可选参数。
style
日期格式样式,借以将datetime或smalldatetime数据转换为字符数据(nchar、nvarchar、char、varchar、nchar或nvarchar数据类型);或者字符串格式样式,借以将float、real、money或smallmoney数据转换为字符数据(nchar、nvarchar、char、varchar、nchar或nvarchar数据类型)。
SQLServer支持使用科威特算法的阿拉伯样式中的数据格式。
在表中,左侧的两列表示将datetime或smalldatetime转换为字符数据的style值。给style值加100,可获得包括世纪数位的四位年份(yyyy)。
不带世纪数位(yy)带世纪数位(yyyy)

标准

输入/输出**

-0或100(*)默认值monddyyyyhh:miAM(或PM)

1101美国mm/dd/yyyy

2102ANSIyy.mm.dd

3103英国/法国dd/mm/yy

4104德国dd.mm.yy

5105意大利dd-mm-yy

6106-ddmonyy

7107-mondd,yy

8108-hh:mm:ss

-9或109(*)默认值+毫秒monddyyyyhh:mi:ss:mmmAM(或PM)

10110美国mm-dd-yy

11111日本yy/mm/dd

12112ISOyymmdd

-13或113(*)欧洲默认值+毫秒ddmonyyyyhh:mm:ss:mmm(24h)

14114-hh:mi:ss:mmm(24h)

-20或120(*)ODBC规范yyyy-mm-ddhh:mm:ss[.fff]

-21或121(*)ODBC规范(带毫秒)yyyy-mm-ddhh:mm:ss[.fff]

-126(***)ISO8601yyyy-mm-ddThh:mm:ss:mmm(不含空格)

-130*科威特ddmonyyyyhh:mi:ss:mmmAM

-131*科威特
默认值(style0或100、9或109、13或113、20或120、21或121)始终返回世纪数位(yyyy)。

**当转换为datetime时输入;当转换为字符数据时输出。

***专门用于XML。对于从datetime或smalldatetime到character数据的转换,输出格式如表中所示。对于从float、money或smallmoney到character数据的转换,输出等同于style2。对于从real到character数据的转换,输出等同于style1。

重要默认情况下,SQLServer根据截止年份2049解释两位数字的年份。即,两位数字的年份49被解释为2049,而两位数字的年份50被解释为1950。许多客户端应用程序(例如那些基于OLE自动化对象的客户端应用程序)都使用2030作为截止年份。SQLServer提供一个配置选项("两位数字的截止年份"),借以更改SQLServer所使用的截止年份并对日期进行一致性处理。然而最安全的办法是指定四位数字年份。

当从smalldatetime转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。当从datetime或smalldatetime值进行转换时,可以通过使用适当的char或varchar数据类型长度来截断不需要的日期部分。
下表显示了从float或real转换为字符数据时的style值。
值输出

0(默认值)最大为6位数。根据需要使用科学记数法。

1始终为8位值。始终使用科学记数法。

2始终为16位值。始终使用科学记数法。

在下表中,左列表示从money或smallmoney转换为字符数据时的style值。
值输出

0(默认值)小数点左侧每三位数字之间不以逗号分隔,小数点右侧取两位数,例如4235.98。

1小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如3,510.92。

2小数点左侧每三位数字之间不以逗号分隔,小数点右侧取四位数,例如4235.9819。

返回类型

返回与datatype0相同的值。
注释

隐性转换指那些没有指定CAST或CONVERT函数的转换。而显式转换指那些已指定了所需CAST(CONVERT)函数的转换。下面的图表显示了所有可用于SQLServer系统提供的数据类型的显式和隐性转换,这些数据类型包括bigint和sql_variant。

说明因为Unicode数据始终使用偶数位字节,所以当在binary或varbinary数据类型与Unicode所支持的数据类型之间进行转换时会使用提示。例如,此转换不返回41的十六进制值,而是返回4100的十六进制值:SELECTCAST(CAST(0x41ASnvarchar)ASvarbinary)

不支持text和image数据类型的自动数据类型转换。可以将text数据显式转换为字符数据,将image数据显性转换为binary或varbinary数据,但是最大长度为8000。如果尝试进行不正确的转换(例如,将包含字母的字符表达式转换为int),则SQLServer会产生错误信息。
当CAST或CONVERT的输出是字符串并且输入也是字符串时,输出与输入具有相同的排序规则和排序规则标签。如果输入不是字符串,则输出采用数据库的默认排序规则及强制默认的排序规则标签。有关更多信息,请参见排序规则的优先顺序。
若要给输出指派不同的排序规则,请将COLLATE子句应用到CAST或CONVERT函数的结果表达式中。例如:
SELECTCAST(''abc''ASvarchar(5))COLLATEFrench_CS_AS

不存在有关赋值的从sql_variant数据类型进行的隐性转换,但是存在转换为sql_variant的隐性转换。
将字符或二进制表达式(char、nchar、nvarchar、varchar、binary或varbinary)转换为不同数据类型的表达式时,数据可能会被截断,只显示一部分,或者因为结果太短无法显示而返回错误。除下表中所显示的转换外,转换为char、varchar、nchar、nvarchar、binary和varbinary时将被截断。
varchar*

ncharE

nvarcharE

money、smallmoney、numeric、decimal、float或realcharE

varcharE

ncharE

nvarcharE


*结果长度太短而无法显示。

E因为结果长度太短无法显示而返回错误。

MicrosoftSQLServer仅保证往返转换(即,从原始数据类型进行转换后又返回原始数据类型)在各版本间产生相同值。下面的示例显示往返转换:
DECLARE@myvaldecimal(5,2)SET@myval=193.57SELECTCAST(CAST(@myvalASvarbinary(20))ASdecimal(10,5))--Or,usingCONVERTSELECTCONVERT(decimal(10,5),CONVERT(varbinary(20),@myval))

例如,不要尝试构造binary值并将它们转换为数字数据类型分类的数据类型。SQLServer并不保证decimal或numeric数据类型转换为binary的结果在SQLServer各版本间相同。

下面的示例显示了由于太短而无法显示的结果表达式。
USEpubsSELECTSUBSTRING(title,1,25)ASTitle,CAST(ytd_salesASchar(2))FROMtitlesWHEREtype=''trad_cook''

下面是结果集:

Title---------------------------Onions,Leeks,andGarlic*FiftyYearsinBuckingham*Sushi,Anyone?*(3row(s)affected)

当具有不同小数位数的数据类型进行转换时,值将被截断为最精确的数位。例如,SELECTCAST(10.6496ASint)的结果为10。

转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则要转换的值将被四舍五入。例如,CAST(10.3496847ASmoney)的结果是$10.3497。
当将非数字类型的char、nchar、varchar或nvarchar数据转换为int、float、numeric或decimal时,SQLServer将返回错误信息。当将空字符串("")转换为numeric或decimal时,SQLServer也将返回错误信息。
使用二进制字符串数据

当binary或varbinary数据转换为字符数据并且在x后面指定了奇数位的值时,SQLServer在x后面添加0(零)以成为偶数位值。

二进制数据包含从0到9和从A到F(或从a到f)的字符,每两个字符为一组。二进制字符串必须以0x开头。例如,若要输入FF,请键入0xFF。最大值是一个8000字节的二进制值,每个字节的最大值都是FF。Binary数据类型不能用于十六进制数据,而是用于位模式。对于存储为二进制数据的十六进制数字的转换和计算结果,无法保证其准确性。
当指定binary数据类型的长度时,每两个字符被算作是一个单位长度。长度10表示将输入10个双字符组。
由0x表示的空二进制字符串可以储存为二进制数据。
示例

A.同时使用CAST和CONVERT

每个示例都将检索书名(这些图书的截止当前销售额的第一位数字为3),并将这些图书的ytd_sales转换为char(20)。

--UseCAST.USEpubsGOSELECTSUBSTRING(title,1,30)ASTitle,ytd_salesFROMtitlesWHERECAST(ytd_salesASchar(20))LIKE''3%''GO--UseCONVERT.USEpubsGOSELECTSUBSTRING(title,1,30)ASTitle,ytd_salesFROMtitlesWHERE
CONVERT(char(20),ytd_sales)LIKE''3%''GO

下面是任一查询的结果集:

Titleytd_sales-----------------------------------------CookingwithComputers:Surrep3876ComputerPhobicANDNon-Phobic375EmotionalSecurity:ANewAlgo3336Onions,
Leeks,andGarlic:Coo375(4row(s)affected)

B.使用带有算术运算符的CAST

下面的示例通过将总的截止当前销售额(ytd_sales)与每本图书的价格(price)相除,进行单独列计算(Copies)。在四舍五入到最接近的整数后,此结果将转换为int数据类型。

USEpubsGOSELECTCAST(ROUND(ytd_sales/price,0)ASint)AS''Copies''FROMtitlesGO

下面是结果集:

Copies------20532462622051027440NULL383205NULL1718716204418181263
273(18row(s)affected)

C.使用CAST进行串联

下面的示例使用CAST数据类型转换函数来串联非字符、非二进制表达式。

USEpubsGOSELECT''Thepriceis''+CAST(priceASvarchar(12))FROMtitlesWHEREprice>10.00GO

下面是结果集:

------------------Thepriceis19.99Thepriceis11.95Thepriceis19.99Thepriceis19.99Thepriceis22.95Thepriceis20.00Thepriceis21.59Thepriceis10.95
Thepriceis19.99Thepriceis20.95Thepriceis11.95Thepriceis14.99(12row(s)affected)

D.使用CAST获得更多易读文本

下面的示例在选择列表中使用CAST将title列转换为char(50)列,这样结果将更加易读。

USEpubsGOSELECTCAST(titleASchar(50)),ytd_salesFROMtitlesWHEREtype=''trad_cook''GO

下面是结果集:

ytd_sales-----------------------------------------------------------Onions,Leeks,andGarlic:CookingSecretsofthe375FiftyYearsinBuckinghamPalaceKitchens
15096Sushi,Anyone?4095(3row(s)affected)

E.使用带有LIKE子句的CAST

下面的示例将int列(ytd_sales列)转换为char(20)列,以便使用LIKE子句。

USEpubsGOSELECTtitle,
-
ytd_salesFROMtitlesWHERECAST(ytd_salesASchar(20))LIKE''15%''ANDtype=''trad_cook''GO


下面是结果集:
titleytd_sales------------------------------------------------------------

Mysql:

MySQL的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下:

1
CAST
(value

as
type);
2
CONVERT
(value,type);
就是CAST(xxxAS类型),CONVERT(xxx,类型)。

可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

二进制,同带binary前缀的效果:BINARY
字符型,可带参数:CHAR()
日期:DATE
时间:TIME
日期时间型:DATETIME
浮点数:DECIMAL
整数:SIGNED
无符号整数:UNSIGNED

下面举几个例子:

例一

1
mysql>
SELECT
CONVERT
(
'23'
,SIGNED);
2
+
----------------------+
3
|
CONVERT
(
'23'
,SIGNED)|
4
+
----------------------+
5
|23|
6
+
----------------------+
7
1row
in
set
例二

1
mysql>
SELECT
CAST
(
'125e342.83'
AS
signed);
2
+
------------------------------+
3
|
CAST
(
'125e342.83'
AS
signed)|
4
+
------------------------------+
5
|125|
6
+
------------------------------+
7
1row
in
set
例三

1
mysql>
SELECT
CAST
(
'3.35'
AS
signed);
2
+
------------------------+
3
|
CAST
(
'3.35'
AS
signed)|
4
+
------------------------+
5
|3|
6
+
------------------------+
7
1row
in
set
像上面例子一样,将varchar转为int用cast(aassigned),其中a为varchar类型的字符串。

例4

在SQLServer中,下面的代码演示了datetime变量中,仅包含单纯的日期和单纯的时间时,日期存储的十六进制存储表示结果。

01
DECLARE@dtdatetime
02
03
--单纯的日期
04
SET@dt=
'1900-1-2'
05
SELECTCAST(@dt
as
binary(8))
06
--结果:0x0000000100000000
07
08
--单纯的时间
09
SET@dt=
'00:00:01'
10
SELECTCAST(@dt
as
binary(8))
11
--结果:0x000000000000012C
MySQL的类型转换和SQLServer一样,就是类型参数有点点不同:CAST(xxxAS类型),
CONVERT(xxx,类型)。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐