配色: 字号:
SQLServer转MYSQL
2015-09-08 | 阅:  转:  |  分享 
  
SQLSerer转MySQL问题汇总

1、SQLServer转MySQL时bit类型长度要改为8;



SQL语句中不要中括号;



SQL语句中不要包含"dbo.表名";



导入数据的时候要注意数据库的字符集类型,基本用UTF8最好;



5、建表建库的时候要设置为UTF-8类型;



6、别名的问题

select''count''=count()

改为

selectcount()ASCount



7、REPLACE去掉了

SELECT

REPLACE(

REPLACE(role_name,'''''''',''?),

''

'',

''''

)ASrole_name,

idASkeyForList

FROM

(

SELECT

,ROW_NUMBER()OVER(ORDERBYIdASC)ASRowNumber

FROM

(

SELECT



FROM

mg_organise

WHERE

operate_type<>''DISUSE''

ANDoperate_type<>''Disuse''

)ASdataTableForNew

WHERE

1=1

)ASdataTableForRowNumber

WHERE

RowNumberBETWEEN1

AND10





去掉了replace这一大串,效率太低,而且很难修改为MySQL。



8、分页

ROW_NUMBER()

Row_Number()分页的方式改为Limit



9、窗口函数

OVER(ORDERBYIdASC)ASRowNumber

OVER要改写;



INSERT自增列的处理

在MYSQL中,Insert的自增列要给NULL;

如INSERTINTO表名VALUES(NULL,’123’)



11、删除DELETE

SQLServer:DELETE表名

MySQL:DELETEFROM表名



12、日期比较

MYSQL日期比较(直接比较字符串也可以)

selectfromstudentwhereUNIX_TIMESTAMP(''2012-02-2700:00:00'')UNIX_TIMESTAMP(created_date);





13、DATEADD函数的不同

Mysql的Date_Add函数

date_add(NOW(),interval''-00:00''MINUTE_second);

SQLServer的DateAdd函数

DATEADD(minute,"+(-Convert.ToInt32(this.LowFre.Text)).ToString()+",GETDATE())



GETDATE()->NOW()



ais_basic_info_history有个查询实在太慢,加了个索引:

CREATEINDEXIX_LastTimeONais_basic_info_history(last_time)

字符串拼接

SQLServer:+

MySQL:的字符串拼接不用''+'',而是用Concat函数



ISNULL与STUFF函数

SQLServer MYSQL

ISNULL -> IFNULL

STUFF -> INSERT









多行转单行逗号分割

SQLServer的 FORXMLPATH('''')

->

在MYSQL中只有用GROUPBY实现:

SELECTgroup_concat(id)FROMwg_sea_infoASb

WHEREb.operate_type<>''Disuse''

GROUPBYwg_state



取前几条

SQLServer->Top

MySQL->Limit



UPDATEwg_info

SETwg_content=Concat(''发生了'',

(

SELECT

COUNT()

FROM

wg_sea_info

WHERE

wg_state=''1''

ANDoperate_type<>''Disuse''

)

,''艘海上停留超时''),

wg_value=ISNULL(

(

SELECTSTUFF(

(

SELECT

'',''+cast(b.idASVARCHAR(500))

FROM

wg_sea_infoASb

WHERE

b.wg_state=''1''

ANDb.operate_type<>''Disuse''

ANDa.id=a.idFORXMLPATH('''')

),1,1,'''')ASidslimit0,1

FROM

wg_sea_infoASa

),

''''

),

operate_time=Now(),

operate_type=''Update''

WHERE

wg_tbl_name=''wg_sea_info''

ANDoperate_type<>''Disuse''



创建触发器

MySQL与SQLServer触发事件和触发表的语法顺序调转

MySQL例子:

CREATETRIGGERtri_aAFTERINSERTONa

FOREACHROW

BEGIN

······

END;





SQLServer例子:

CREATETRIGGERtri_aONaFORINSERT

AS



MySQL:创建触发器时必须使用foreachrow这是因为加上这句则触发事件就是行级的,那么对每一行有这个动作都要触发一次事件

MySQL:创建语句完后需区间开始和结束才能开始定义参数等操作,而SQL可用AS连接后定义参数



定义参数

SQLServer

DECLARE@IdVARCHAR(100)

MySQL

DECLAREIdVARCHAR(100);



基本语法

MySQL每个执行语句完毕后需加分号;

例子:DECLAREIdVARCHAR(100);

insertintotab2(tab2_id)values(new.tab1_id);



注释代码

单行注释:--注释行,双横杠后必须空一格

多行注释:/注释代码/



创建游标

MySQL

DECLAREIdVARCHAR(100);

DECLAREcursorCURSORFOR

SELECTidFROMnewWHEREid>0;

DECLARECONTINUEHANDLERFORSQLSTATE''02000''setId=NULL;

OPENcursor;

WHILE(IdisnotNULL)DO

FETCHcursorINTOId;

······内容

ENDWHILE;

CLOSEcursor

说明:MYSQL有数据新增时,新增的数据储存在临时表为new



变量赋值

第一个赋值由查询集合获得的必须在最外层添加括号

SETshipId=(SELECTship_idFROMnewWHEREid=IdLIMIT0,1);

或者

SELECTship_idintoshipIdFROMnewWHEREid=Id



填充字符

MySQL

lpad(str,len,padstr)

字符串padstr对str进行左边填补直至它的长度达到len个字符长度,然后返回str。如果str的长度长于len'',那么它将被截除到len个字符。DROPTABLEIFEXISTStab1;

DROPTRIGGERIFEXISTStri_tab1;--删除触发器



日期转为字符窜任意格式

例子:DATE_FORMAT(‘2014-08-2717:43:30’,''%Y-%m-%d'')--2014-08-27

拓展:%Y:年%c:月%d:日%H:小时%i:分钟%s:秒date_format(now(),''%Y-%c-%d%h:%i:%s'')



新增数据和更新语句注意事项

MYSQL新增一条数据时插入的数据由查询语句获取其它表信息时建议指定插入列

例子:

INSERTINTOais_turnover_time(flight_id,basic_id,ship_id,haven_name,turnover_type,turnover_buoy,ship_registry,state,delay_num,operate_time,operate_type)

SELECT

(SELECTidFROMais_flight_infoWHEREship_id=shipIdORDERBYout_buoyDESCLIMIT0,1)asflight_id,

(SELECTais_history_idFROMio_enclosure_historyWHEREid=ybId)asbasic_id,

shipId,

havenname,

''2'',

IoTime,

(SELECTship_registryFROMshipWHEREship_id=shipIdANDoperate_type<>''Disuse'')asship_registry,

state,

delayNum,

NOW()ASoperate_time,''Add''ASoperate_type

FROMio_enclosure_historyASaWHEREid=ybId;



注意:由查询集返回值必须要as自定名字。如:(SELECTidFROMais_flight_infoWHEREship_id=shipIdLIMIT0,1)asflight_id

如果该表有时间类型必须设置其默认值NULL或1900-01-0100:00:00



更新时条件不可带查询子从句,如:whereid=(selectfromtable)



强制转换值类型

MYSQL比SQLServer限制大些,不能随便填数据类型,只有几个固定参数和字符集转化的能力。

字符集转换:CONVERT(xxxUSINGgb2312)

类型转换和SQLServer一样,就是类型参数有点点不同:

SQL——>CAST(xxxAS类型)

MYSQL——>CONVERT(xxx,类型)

可用的类型

二进制,同带binary前缀的效果:BINARY

字符型,可带参数:CHAR()如:CHAR(100)

日期:DATE

时间:TIME

日期时间型:DATETIME

浮点数:DECIMAL

整数:SIGNED

无符号整数:UNSIGNED











献花(0)
+1
(本文系明朝更替首藏)