将sql server数据库改写成mysq数据库l

2017-01-09 14:09:07来源:oschina作者:默迹人点击

由于项目需要,将旧sql server数据库改成Mysql数据库,期间涉及到表结构,数据,存储函数和过程,以及CRUD语句。现将记录如下。


(1) 表结构

用户dbo,mysql没有sqlserver的用户带来的功效。所以统一删除dbo.;
自增字段,mysql中自增字段不能为numeric类型,统一修改成int;
自增字段,mysql中该字段必须是键或带索引;
行长度限制,mysql中单行最大长度为65535,不包含text和blod,将部分varchar修改成tinytext即可
char字段最大长度,mysql不超过255
规则,mysql没有规则概念,故删除规则

(2) 数据


通过使用DB2DB工具进行表结构转化和数据搬迁能提高效率


(3)存储函数和过程

注释

Mysql:'-- '注意空格
Sqlserver:'--'变量名规范不同

Mysql:@变量名,为用户变量,直接写变量名为局部变量
Sqlserver:@变量名,为局部变量变量声明位置不同

Mysql:declare必须放在方法最前面
Sqlserver:都行游标循环结束的判断条件不同

Mysql:通过定义DECLARE CONTINUE HANDLER FOR NOT FOUND SET XXX;来捕捉已到末尾
Sqlserver:通过全局变量@@fetch_status判断循环写法不同

Mysql:While(条件) Do ... End While;
Sqlserver:While 条件 Begin ... End;存储过程的定义语句不同

Mysql:Create Procedure XXX(a int,b int) Begin ... End
Sqlserver:Create Procedure XXX a int,b int As ...Begin ... End临时表快速创建和插入不同

Mysql:CreateTemporary Table If Not Exists XXX(Select * From XXX);
Sqlserver:select * into #XXX from xxx; -- 以是否有#判断是否为临时表执行sql出错的处理不同

Mysql:DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET temp_errorNum=1;
Sqlserver:全局变量 @@error;多表更新操作不同

Mysql:update 多表连接 set A1=XX
Sqlserver:update 修改表 set A1=XX from 表连接存储过程返回的要求不同

Mysql:不能有返回值
Sqlserver:可以有存储过程的调用不同

Mysql:call 过程名(参数);
Sqlserver:call dbo.过程名 参数;游标声明的位置

Mysql:先声明变量,之后接着是游标。注游标前不能有赋值操作
Sql server:都行游标销毁不同

Mysql:关闭游标即可
Sqlserver:关闭后需调用deallocate XXX来销毁游标引用游标的处理不同

Mysql:由于不能先赋值后定义游标,所以不支持动态游标,可通过创建临时表实现
Sqlserver:无所谓存储函数对递归的支持不同

Mysql:不允许递归,可用迭代替代
Sqlserver:允许存储函数中对查询的要求

Mysql:不允许查询出结果集,例如select * from A;
Sqlserver:允许

(3)CRUD语句

isnull(exp1,exp2)改为 ifnull(exp1,exp2)
charindex(substr,str) 改为 instr(str,substr)
datediff(day,date1,date2) 改为TIMESTAMPDIFF(day,date1,date2)
遇到+号,有两种情况

数字相加,保持不变
字符串相加,用concat(a,b)去掉dbo.
Exec fun para1,para2 改为 call fun(para1,para2)
sql语句末尾都要加 ‘;‘ 代码中大部分由于框架,可以不用加。
delete 语句必须加from
len(str) 改为 length(str)
cast(ori as type)

type 若为 int,改为 signed
type 若为 varchar,改为 char
type 若为 number,改为decimaltop1 改成末尾添加 limit 1
[字段别名/表别名] 去掉中括号换空格
convert方法

日期型 convert(varcher,date,112)改为date_format(date,'%Y%m%d')
其他依情况而定dateadd(month,1,date) 改为 DATE_ADD(date,INTERVAL 1 month)
mysql对大小写不敏感,所以例如inT函数,需要改成·inT·(按键1左边的符号)
isDate(str)=1 改为Date(str) is not null

TIMESTAMPDIFF,DATE_ADD,DATE_FORMAT下必须符合yyyymmdd等格式,不能只有yyyy


substring(str,0,length),第二参数为0时,改为substring(str,1,length-1);mysql没有sqlserver从0开始的效果。


UUID()和sqlserver 的NEWID()有很大不同



Mysql 的UUID(),一条sql语句,即使多行,也只有一种值,不适合在insert ... select句式中作主键


Sqlserver 的NEWID(),一条语句多行记录,值都不同。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台