cast 和convert和concat详解以及mysql和sqlserver兼容问题
2013-10-18 08:56
357 查看
总结:
以下这条仅仅适用于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可以转换成的类型限制:
就是
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
二进制,同带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); |
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
二进制,同带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 |
例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 |
CONVERT(xxx,类型)。
相关文章推荐
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- php单双引号对变量解析的影响以及php向mysql插入数据时的变量解析问题详解
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- mysql的blob读取和sqlserver的image读取方式 blob和image兼容问题及varbinary(max)
- php单双引号对变量解析的影响以及php向mysql插入数据时的变量解析问题详解
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- linux 安装mysql 5.7.21详解以及安装过程中所遇问题解决
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- VC++控制台程序使用Mysql,以及和MFC程序的兼容问题,工具VS2010ultimate
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法
- 安装widows mysql 免安装版(zip) 步骤详解 以及遇到问题解决 以及忘记密码的修改方法